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

Posted

技术标签:

【中文标题】Pyspark根据另一列的模式替换列中的字符串【英文标题】:Pyspark replace string from column based on pattern from another column 【发布时间】:2019-05-30 04:37:20 【问题描述】:

我有一个带有文本列和名称列的数据框。我想检查该名称是否存在于文本列中,以及是否将其替换为某个值。 我希望以下内容会起作用:

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

但是 Column 是不可迭代的,所以它不起作用。我必须写一个udf来做到这一点吗?那会是什么样子?

【问题讨论】:

***.com/questions/45615621/…的可能重复 Using a column value as a parameter to a spark DataFrame function的可能重复 @giser_yugang 这是 pyspark 你的链接问题是关于 scala 的。 【参考方案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|
#+-------+-----+--------+

【讨论】:

你知道如何处理 name 是正则表达式的情况吗?我发现 expr("regexp_replace(column, 'regex', 'replace_value')") 有问题 补充一下,这是因为“正则表达式”是正则表达式,但它被包围为来自 expr 的字符串似乎会干扰。 我想我解决了,但不知道为什么。 ^([^.]+)?\\.代替 ^.*?\\. (但后者在我不使用 expr 时有效)

以上是关于Pyspark根据另一列的模式替换列中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark数据帧:根据另一列的值提取列

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

PySpark查找另一列中是否存在一列中的模式

根据c =字符数替换列中的值

如何用同一数据框中其他列的实际列值替换一列中的字符串值?