我有两个RDD有键值对。我想通过键连接它们(根据键,得到所有值的笛卡尔积),我假设可以用pyspark的zip()函数来完成。但是,当我用这个的时候
elemPairs = elems1.zip(elems2).reduceByKey(add)
它给了我一个错误:
^{pr2}$下面是我尝试压缩的2个RDD:
elems1 => [((0, 0), ('A', 0, 90)), ((0, 1), ('A', 0, 90)), ((0, 2), ('A', 0, 90)), ((0, 3), ('A', 0, 90)), ((0, 4), ('A', 0, 90)), ((0, 0), ('A', 1, 401)), ((0, 1), ('A', 1, 401)), ((0, 2), ('A', 1, 401)), ((0, 3), ('A', 1, 401)), ((0, 4), ('A', 1, 401)), ((1, 0), ('A', 0, 305)), ((1, 1), ('A', 0, 305)), ((1, 2), ('A', 0, 305)), ((1, 3), ('A', 0, 305)), ((1, 4), ('A', 0, 305)), ((1, 0), ('A', 1, 351)), ((1, 1), ('A', 1, 351)), ((1, 2), ('A', 1, 351)), ((1, 3), ('A', 1, 351)), ((1, 4), ('A', 1, 351)), ((2, 0), ('A', 0, 178)), ((2, 1), ('A', 0, 178)), ((2, 2), ('A', 0, 178)), ((2, 3), ('A', 0, 178)), ((2, 4), ('A', 0, 178)), ((2, 0), ('A', 1, 692)), ((2, 1), ('A', 1, 692)), ((2, 2), ('A', 1, 692)), ((2, 3), ('A', 1, 692)), ((2, 4), ('A', 1, 692)), ((3, 0), ('A', 0, 936)), ((3, 1), ('A', 0, 936)), ((3, 2), ('A', 0, 936)), ((3, 3), ('A', 0, 936)), ((3, 4), ('A', 0, 936)), ((3, 0), ('A', 1, 149)), ((3, 1), ('A', 1, 149)), ((3, 2), ('A', 1, 149)), ((3, 3), ('A', 1, 149)), ((3, 4), ('A', 1, 149))]
elems2 => [((0, 0), ('B', 0, 573)), ((1, 0), ('B', 0, 573)), ((2, 0), ('B', 0, 573)), ((3, 0), ('B', 0, 573)), ((4, 0), ('B', 0, 573)), ((0, 0), ('B', 1, 324)), ((1, 0), ('B', 1, 324)), ((2, 0), ('B', 1, 324)), ((3, 0), ('B', 1, 324)), ((4, 0), ('B', 1, 324))]
其中((0, 0), ('B', 0, 573)), (0, 0)
是键,('B', 0, 573)
是值。在
在谷歌上快速搜索后,我发现这是一个只在spark 1.2中出现的问题,但我使用的是spark 1.5
错误消息的原因在RDD API中描述。在
正如@alwaysprep所说,您可以使用
join
,因为zip
做了完全不同的事情:如您所见,zip将数组
a
的第n个元素与数组b
的第n个元素相关联,因此数组的大小必须相同。在在您的例子中,数组
elem1
包含的元素比elem2
更多——也许您可以看看rightOuterJoin
(或leftOuterJoin
)。这是因为.join将跳过两个RDD中没有键的元素。例如,我看到(4,0)只存在于elem2
中。如果您join
它们,那么它将被跳过,因为在elem1
数组中找不到它。另外,如果您真的想要笛卡尔积,还有一个方法.cartesian
。在为什么不直接使用elems1.join(elems2)
相关问题 更多 >
编程相关推荐