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

时间:2017-05-17 20:47:04

标签: pyspark sparkr

enter image description here

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

1 个答案:

答案 0 :(得分:1)

以下代码段应该有用。此方法将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|
+------------+------+

没有将数据帧转换为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|
+------------+------+