使用Pyspark替换Spark数据框列中的字符串

73

我想对Spark Dataframe的一列执行基本的词干处理,通过替换子字符串来实现。最快的方法是什么?

在我的当前用例中,我有一个地址列表,我想要进行规范化。例如,这个数据框:

id     address
1       2 foo lane
2       10 bar lane
3       24 pants ln

会变成

id     address
1       2 foo ln
2       10 bar ln
3       24 pants ln

1
你的Spark版本是什么? - Daniel de Paula
2个回答

171
对于 Spark 1.5 或更高版本,您可以使用 functions 包:
from pyspark.sql.functions import *
newDf = df.withColumn('address', regexp_replace('address', 'lane', 'ln'))

快速解释:
  • 调用函数withColumn来向数据框中添加(或替换,如果名称已存在)一列。
  • 函数regexp_replace将通过替换所有与模式匹配的子字符串来生成一个新列。

32
请记住,regexp_replace 的第一个参数指的是要更改的列,第二个参数是要查找的正则表达式,最后一个参数是替换它的方式。 - lfvv
我可以在管道内使用regexp_replace吗?谢谢。 - Kailegh
4
我们能否在这段代码中更改多个项目? - user15050871
@elham,您可以使用此函数更改一个列中符合正则表达式的任何值:https://spark.apache.org/docs/2.2.0/api/R/regexp_replace.html - gbeaven
在PySpark中,如何对单个数据框中的两个字符串列进行减法运算 - Mario
1
这个能否被改进,只替换整个字符串而不是子字符串?例如,如果我想用 'ln' 替换 'lane',但保留 'skylane' 不变呢? - GreenEye

10

对于Scala

import org.apache.spark.sql.functions.regexp_replace
import org.apache.spark.sql.functions.col
data.withColumn("addr_new", regexp_replace(col("addr_line"), "\\*", ""))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接