我是Spark的新手,问了一个基本的愚蠢问题。我的数据格式为
[firstName1,lastName1,firstName2,lastName2,firstName3,lastName3,.....,firstNameN,lastNameN]
所以我必须迭代到这个RDD。我必须连接firstName和lastName并生成类似
的输出[firstName1 lastName1,firstName2 lastName2,firstName3 lastName3,.....,firstNameN lastNameN].
通过在RDD上应用动作collect()
并编写python代码,我能够实现它。但由于这是一个巨大的我不能申请收集。不知怎的,我无法理解如何实现这一目标。
非常感谢任何帮助
答案 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']