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

Pyspark根据另一列的模式替换列中的字符串,pyspark,Pyspark,我有一个带有文本列和名称列的数据框。我想检查该名称是否存在于文本列中,以及是否存在,并用一些值替换它。 我希望以下措施能够奏效: df = df.withColumn("new_text",regex_replace(col("text),col("name"),"NAME")) 但列不可编辑,所以它不工作。我必须要写一个udf才能做到这一点吗?看起来怎么样?你差一点就到了。下面是带有withColumn和selectExpr选项的详细示例: 样品df df = spark.createDat

我有一个带有文本列和名称列的数据框。我想检查该名称是否存在于文本列中,以及是否存在,并用一些值替换它。 我希望以下措施能够奏效:

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

但列不可编辑,所以它不工作。我必须要写一个udf才能做到这一点吗?看起来怎么样?

你差一点就到了。下面是带有
withColumn
selectExpr
选项的详细示例:

样品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:
带列
使用
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:
使用
regexp\u 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|
#+-------+-----+--------+

可能重复的@giser_yugang可能重复的@giser_yugang这是pyspark你的链接问题是关于scala的。你知道当name是regex表达式时如何处理这种情况吗?我发现expr有一个问题(“regexp_replace(column,'regex',replace_value')”),这是因为'regex'是regex,但它被expr中的字符串包围似乎会产生干扰。我想我解决了这个问题,但不确定为什么^([^.]+)?\\. 工作而不是^.*?\\。(但当我不使用expr时,后者可以工作)