【发布时间】:2017-08-07 23:03:30
【问题描述】:
假设我有一个包含许多列的数据框,有些是 string 类型,有些是 int 类型,有些是 map 类型。
例如
字段/列types: stringType|intType|mapType<string,int>|...
|--------------------------------------------------------------------------
| myString1 |myInt1| myMap1 |...
|--------------------------------------------------------------------------
|"this_is_#string"| 123 |{"str11_in#map":1,"str21_in#map":2, "str31_in#map": 31}|...
|"this_is_#string"| 456 |{"str12_in#map":1,"str22_in#map":2, "str32_in#map": 32}|...
|"this_is_#string"| 789 |{"str13_in#map":1,"str23_in#map":2, "str33_in#map": 33}|...
|--------------------------------------------------------------------------
我想从 String 和 Map 类型的所有列中删除一些字符,例如 '_' 和 '#' 所以结果 Dataframe/RDD 将是:
|------------------------------------------------------------------------
|myString1 |myInt1| myMap1|... |
|------------------------------------------------------------------------
|"thisisstring"| 123 |{"str11inmap":1,"str21inmap":2, "str31inmap": 31}|...
|"thisisstring"| 456 |{"str12inmap":1,"str22inmap":2, "str32inmap": 32}|...
|"thisisstring"| 789 |{"str13inmap":1,"str23inmap":2, "str33inmap": 33}|...
|-------------------------------------------------------------------------
我不确定将 Dataframe 转换为 RDD 并使用它或在 Dataframe 中执行工作是否更好。
另外,不确定如何以最佳方式处理具有不同列类型的正则表达式(我在唱 scala)。 我想对这两种类型(字符串和映射)的所有列执行此操作,尽量避免使用如下列名称:
def cleanRows(mytabledata: DataFrame): RDD[String] = {
//this will do the work for a specific column (myString1) of type string
val oneColumn_clean = mytabledata.withColumn("myString1", regexp_replace(col("myString1"),"[_#]",""))
...
//return type can be RDD or Dataframe...
}
是否有任何简单的解决方案来执行此操作? 谢谢
【问题讨论】:
标签: regex scala apache-spark dataframe rdd