替换scala中数据框中所有列中出现的所有String

时间:2017-09-12 21:39:58

标签: scala dataframe spark-dataframe

我有一个包含20列的数据框,在这些列中有一个值XX,我想用空字符串替换。我如何在scala中实现这一点。 withColumn函数用于单个列,但是我希望传递所有20个列并用空字符串替换整个帧中具有XX的值,有人可以提示一种方法。

由于

2 个答案:

答案 0 :(得分:2)

您可以收集列表中的所有stringType列,并使用foldLeftremoveXX UDF应用于每个列,如下所示:

val df = Seq(
  (1, "aaXX", "bb"),
  (2, "ccXX", "XXdd"),
  (3, "ee", "fXXf")
).toDF("id", "desc1", "desc2")

import org.apache.spark.sql.types._

val stringColumns = df.schema.fields.collect{
  case StructField(name, StringType, _, _) => name
}

val removeXX = udf( (s: String) =>     
  if (s == null) null else s.replaceAll("XX", "")
)

val dfResult = stringColumns.foldLeft( df )( (acc, c) =>
  acc.withColumn( c, removeXX(df(c)) )
)

dfResult.show
+---+-----+-----+
| id|desc1|desc2|
+---+-----+-----+
|  1|   aa|   bb|
|  2|   cc|   dd|
|  3|   ee|   ff|
+---+-----+-----+

答案 1 :(得分:0)

def clearValueContains(dataFrame: DataFrame,token :String,columnsToBeUpdated : List[String])={
  columnsToBeUpdated.foldLeft(dataFrame){
    (dataset ,columnName) =>
      dataset.withColumn(columnName, when(col(columnName).contains(token), "").otherwise(col(columnName)))
  }
}

您可以使用此功能..在其中可以将令牌设置为“ XX”。另外,columnsToBeUpdated是列列表,您需要在其中搜索特定列。

dataset.withColumn(columnName, when(col(columnName) === token, "").otherwise(col(columnName)))

您可以使用上面的代码替换完全匹配