Pyspark根据另一列中的模式替换列中的字符串

时间:2019-05-30 04:37:21

标签: pyspark

我有一个带有文本列和名称列的数据框。我想检查名称是否在文本列中,以及是否确实将其替换为某些值。 我希望以下方法能起作用:

df = df.withColumn("new_text",regex_replace(col("text),col("name"),"NAME"))

但是Column不可迭代,因此不起作用。我需要写udf来做到这一点吗?看起来怎么样?

1 个答案:

答案 0 :(得分:1)

您快要接近了。以下是带有withColumnselectExpr选项的详细示例:

样本df

df = spark.createDataFrame([('This is','This'),
('That is','That'),
('That is','There')],
['text','name'])

#+-------+-----+
#|   text| name|
#+-------+-----+
#|This is| This|
#|That is| That|
#|That is|There|
#+-------+-----+

选项1: withColumn使用expr功能

from pyspark.sql.functions import expr, regexp_replace

df.withColumn("new_col1",expr("regexp_replace(text,name,'NAME')")).show()

#+-------+-----+--------+
#|   text| name|new_col1|
#+-------+-----+--------+
#|This is| This| NAME is|
#|That is| That| NAME is|
#|That is|There| That is|
#+-------+-----+--------+

选项2: selectExpr使用regexp_replace

 from pyspark.sql.functions import regexp_replace


df.selectExpr("*",
          "regexp_replace(text,name,'NAME') AS new_text").show()

#+-------+-----+--------+
#|   text| name|new_text|
#+-------+-----+--------+
#|This is| This| NAME is|
#|That is| That| NAME is|
#|That is|There| That is|
#+-------+-----+--------+