在 Spark 中基于正则表达式过滤和重新分配

Filtering and reassigning based on regex in Spark

我有一个名为 df 的 Spark DataFrame,如上图所示。有一个名为 region 的列当前只有值 NE。有一个名为 address 的单独列,其中包含许多地址。我想将 region 的观察结果更改为 VA,其中 addressVA 结尾。我怎样才能做到这一点? pysparksparkr 命令都可以。

下面的代码片段应该有效。此方法将 Dataframe 转换为 RDD,并执行映射操作以适当地更改区域。

>>> df = sc.parallelize([("NE","NE"), ("Luray, VA", "NE"), ("VA" ,"NE"), ("Richmond, VA",  "NE")]).toDF(["address", "region"])
>>> df.rdd.map(lambda (x,y): (x,'VA' if x.endswith('VA') else y)).toDF(["address", "region"]).show()
+------------+------+
|     address|region|
+------------+------+
|          NE|    NE|
|   Luray, VA|    VA|
|          VA|    VA|
|Richmond, VA|    VA|
+------------+------+

无需将 dataframe 转换为 rdd 的方法如下所示。注意:这种方法优于 rdd 方法,因为它的性能更高,并且对模式的假设更少。

from pyspark.sql.functions import udf
df = sc.parallelize([("NE","NE"), ("Luray, VA", "NE"), ("VA" ,"NE"), ("Richmond, VA",  "NE")]).toDF(["address", "region"])
regionfunc = udf(lambda x: 'VA' if x.endswith('VA') else x)
df.withColumn('region', regionfunc(df.address)).show()

+------------+------+
|     address|region|
+------------+------+
|          NE|    NE|
|   Luray, VA|    VA|
|          VA|    VA|
|Richmond, VA|    VA|
+------------+------+