如何结合两个rdds

时间:2015-03-31 12:21:59

标签: scala apache-spark bigdata rdd

现在我有两个rdds,第一个是这样的

1,2

3,4

5,6

而另一个是这样的

7,8

9,10

11,12

现在我想把这两个rd这样联合起来

1,2,7,8

3,4,9,10

5,6,11,12

我该怎么做? rdd.union无法获得此结果

1 个答案:

答案 0 :(得分:2)

如果您可以保证两个RDD具有相同数量的元素和分区,则可以使用rdd.zip获得所需的结果,然后重新整形结果对:

rdd1.zip(rdd2).map{case ((a1,a2),(b1,b2))=> (a1,a2,b1,b2)}

如果两个RDD的元素或分区数量不同,则需要一些密钥才能加入它们。索引它们的效率不是很高,但是可以达到目的,尽管特定领域的解决方案(如果存在)会更好:

val indexed1 = rdd1.zipWithIndex.map(tuple => tuple.swap)
val indexed2 = rdd2.zipWithIndex.map(tuple => tuple.swap)

val joined = indexed1.join(indexed2)
val result = joined.map{case (k,((a1,a2),(b1,b2))) => (a1,a2,b1,b2)}