如何从Spark数据帧中的所有列中删除反斜杠?

时间:2018-06-06 07:15:01

标签: scala apache-spark apache-spark-sql

如何从火花DF中的多列中删除属于字符串一部分的所有\个字符?

示例行:

11~ADX\|0.00\|ZZ\|BP\|WHT~SE\|41\|0064~GE\|0001\

预期产出:

11~ADX|0.00|ZZ|BP|WHT~SE|41|0064~GE|0001

2 个答案:

答案 0 :(得分:1)

对数据框中的所有列使用foldLeft,这样您就可以在每个单独的列上使用regexp_replace并返回最终的数据帧。使用问题中的示例数据框(下面称为df),删除所有反斜杠

val df2 = df.columns.foldLeft(df)((df, c) => df.withColumn(c, regexp_replace(col(c), "\\\\", "")))

您还可以使用以下内容转义所有反斜杠

val df2 = df.columns.foldLeft(df)((df, c) => df.withColumn(c, regexp_replace(col(c), "\\\\", "\\\\\\\\")))

如果不是所有列都应该使用,请创建一个包含要使用的列的单独变量。要使用除一个(下面的col列)之外的所有列,请使用:

val cols = df.columns diff List("col")
cols.foldLeft ...

答案 1 :(得分:0)

我正在尝试在Pyspark中实施相同的方法。但是,找不到与以下代码等效的代码:

    val df2 = df.columns.foldLeft(df)((df, c) => df.withColumn(c, regexp_replace(col(c), 
    "\\\\", "")))

我尝试按以下步骤对列进行迭代,但是没有用。

    def cleanColumn(tmpdf,colName,findChar,replaceChar):
    tmpdf = tmpdf.withColumn(colName, regexp_replace(colName, findChar, replaceChar))
    return tmpdf

   def cleanDF(df):
   allColNames = df.schema.names
   charsToRemove= ["\\","\!","\\r","\\n"]
   replaceWith =" "
   for colName in allColNames:
      for charToRemove in charsToRemove:
          df=cleanColumn(df,colName,charToRemove,replaceWith) 
      return df