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】:你快接近了。这是带有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: 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 数据框的另一列中的值修改列? F.当边缘情况