【发布时间】:2019-04-17 19:06:16
【问题描述】:
我想使用字典对 pyspark 数据框列执行 regexp_replace 操作。
字典:{'RD':'ROAD','DR':'DRIVE','AVE':'AVENUE',....}
字典将有大约 270 个键值对。
输入数据框:
ID | Address
1 | 22, COLLINS RD
2 | 11, HEMINGWAY DR
3 | AVIATOR BUILDING
4 | 33, PARK AVE MULLOHAND DR
所需的输出数据帧:
ID | Address | Address_Clean
1 | 22, COLLINS RD | 22, COLLINS ROAD
2 | 11, HEMINGWAY DR | 11, HEMINGWAY DRIVE
3 | AVIATOR BUILDING | AVIATOR BUILDING
4 | 33, PARK AVE MULLOHAND DR | 33, PARK AVENUE MULLOHAND DRIVE
我在互联网上找不到任何文档。如果尝试按以下代码传递字典-
data=data.withColumn('Address_Clean',regexp_replace('Address',dict))
抛出错误“regexp_replace 需要 3 个参数,2 个给定”。
数据集的大小约为 2000 万。因此,UDF 解决方案会很慢(由于按行操作)并且我们无法访问支持 pandas_udf 的 spark 2.3.0。 除了使用循环之外,还有其他有效的方法吗?
【问题讨论】:
-
尝试解决方案here。
-
谢谢。但如果我理解正确,这个解决方案基本上是使用循环来替换键值对。如底部评论的链接中所述,这会导致缩放问题。是否没有其他不需要循环的方法,因为它会减慢 2000 万行数据集的处理速度
-
如果您阅读链接解决方案中的说明,您会发现 spark 实际上并没有循环。同样在另一个用户的情况下,缩放问题出现是因为他试图进行 10000 次替换 - 问题在于替换的数量,而不是行数。您的 270 次替换可能会起作用,但如果不是,您可以尝试每 N 次(例如 10 次)替换缓存一次 DataFrame。唯一的其他方法可能是分区/过滤您的数据框并仅应用替换的子集。 (即过滤包含
"RD"等)。
标签: regex dictionary pyspark spark-dataframe