如何在pyspark RDD中连接两个元素?

时间:2016-07-12 19:50:28

标签: pyspark

我是Spark的新手,问了一个基本的愚蠢问题。我的数据格式为

[firstName1,lastName1,firstName2,lastName2,firstName3,lastName3,.....,firstNameN,lastNameN] 

所以我必须迭代到这个RDD。我必须连接firstName和lastName并生成类似

的输出
[firstName1 lastName1,firstName2 lastName2,firstName3 lastName3,.....,firstNameN lastNameN]. 

通过在RDD上应用动作collect()并编写python代码,我能够实现它。但由于这是一个巨大的我不能申请收集。不知怎的,我无法理解如何实现这一目标。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

也许这可以帮到你:

geoloc: wrong number of arguments (0 for 2) (ArgumentError)

输出:names = ["firstName1", "lastName1", "firstName2", "lastName2"] rdd = sc.parallelize(names,len(names)/2) rdd.glom().map(lambda row: [row[0]+" "+row[1]]).collect()

答案 1 :(得分:0)

这可能是黑客攻击或快速解决方法:

案例1:

arr = ["firstName1", "lastName1", "firstName2", "lastName2", "firstName3", "lastName3"]

rdd_names = sc.parallelize(arr, len(arr)/2)
rdd_names.glom().map(lambda row: row[0]+" "+row[1]).collect()

输出结果为:

['firstName1 lastName1', 'firstName2 lastName2', 'firstName3 lastName3']

sc.parallelize(arr, len(arr)/2)将Python列表分发到RDD& len(arr)/2是切片数。我在这里选择了2,因为你想组合firstName1 & lastName1。如果您还有middleName1,则可以将其更改为3。

glom将每个分区中的所有元素合并为一个列表& map-lambda是自定义的。

案例2:

定义列表

arr_1 = ["firstName1", "lastName1", "firstName2", "lastName2", "firstName3", "lastName3"]
arr_2 = arr_1[1:] + arr_1[:1]

创建RDD

rdd_1 = sc.parallelize(arr_1)
rdd_2 = sc.parallelize(arr_2)

Zip&地图 - 拉姆达

rdd_1.zip(rdd_2).map(lambda row: row[0]+" "+row[1]).collect()

输出结果为:

['firstName1 lastName1', 'lastName1 firstName2','firstName2 lastName2',     
'lastName2 firstName3', 'firstName3 lastName3', 'lastName3 firstName1']