Pyspark 删除数据框列中的多个字符

Pyspark removing multiple characters in a dataframe column

查看 pyspark,我看到 translateregexp_replace 可以帮助我找到数据框列中存在的单个字符。

我想知道是否有办法在 regexp_replacetranslate 中提供多个字符串,以便解析它们并用其他内容替换它们。

用例:删除 A 列中的所有 $、# 和逗号 (,)

您可以使用 pyspark.sql.functions.translate() 进行多次替换。传入一串要替换的字母和另一个代表替换值的等长字符串。

例如,假设您有以下 DataFrame:

import pyspark.sql.functions as f
df = sqlCtx.createDataFrame([("0,00",),("#foobar",),("foo, bar, #, and $",)], ["A"])
df.show()
#+------------------+
#|                 A|
#+------------------+
#|           0,00|
#|           #foobar|
#|foo, bar, #, and $|
#+------------------+

并想用 ('X', 'Y', 'Z') 替换 ('$', '#', ',')。只需使用 translate 如:

df.select("A", f.translate(f.col("A"), "$#,", "XYZ").alias("replaced")).show()
#+------------------+------------------+
#|                 A|          replaced|
#+------------------+------------------+
#|           0,00|           X100Z00|
#|           #foobar|           Yfoobar|
#|foo, bar, #, and $|fooZ barZ YZ and X|
#+------------------+------------------+

如果您想删除 ('$', '#', ',') 的所有实例,您可以使用 pyspark.sql.functions.regexp_replace() 来完成。

df.select("A", f.regexp_replace(f.col("A"), "[$#,]", "").alias("replaced")).show()
#+------------------+-------------+
#|                 A|     replaced|
#+------------------+-------------+
#|           0,00|        10000|
#|           #foobar|       foobar|
#|foo, bar, #, and $|foo bar  and |
#+------------------+-------------+

模式"[$#,]"表示匹配括号内的任意字符。 $ 必须转义,因为它在正则表达式中有特殊含义。

如果有人需要在 scala 中执行此操作,您可以按以下代码执行此操作:

val df = Seq(("Test$",19),("$#,",23),("Y#a",20),("ZZZ,,",21)).toDF("Name","age")
import org.apache.spark.sql.functions._
val df1 = df.withColumn("NewName",translate($"Name","$#,","xyz"))
display(df1)

您可以看到如下输出: