Pyspark:从另一个RDD获取RDD元素的索引

时间:2016-04-06 18:31:02

标签: python pyspark rdd

所以我有这两个rdds,如下所示:

rdd1: [([1, 2], 0), ([2, 4], 1)]
rdd2: [([2, 4], 0), ([1, 2], 1)]

我需要的是一个列表,它表示rdd2中rdd1元素的索引。所以它会是这样的:

[1,0]

我知道我可以使用filter和lambda函数找到一个特定的元素索引,但找到整个事情却是另一回事。我头脑中的天真方法是使用for循环,我相信这不是处理这个问题的最佳方法。任何帮助将不胜感激。

由于

1 个答案:

答案 0 :(得分:1)

首先,您必须创建密钥hashable,以便可以以分布式方式对其进行比较。让我们创建一个小帮手

def tupelize_keys(kv):
    k, v = kv
    return tuple(k), v

rdd1H = sc.parallelize([
    ([1, 2], 0), ([2, 4], 1), ([9, 9], 3)
]).map(tupelize_keys)

rdd2H = sc.parallelize([
    ([2, 4], 0), ([1, 2], 1), ([1, 2], 3)
]).map(tupelize_keys)

剩下的只是一个简单的外连接:

rdd1H.leftOuterJoin(rdd2H).values().collect()
## [(0, 1), (0, 3), (1, 0), (3, None)]

请注意,这是一张多图,订单不会被保留。