从两个大型RDD生成新的RDD变量

时间:2017-12-21 07:03:29

标签: apache-spark

我有两个大尺寸的RDD,如下所示。

#First RDD
key1   value1 labelA
key2   value2 lableB
.....

#Second RDD
stepA key1 value1
stepB key2 value2
...

而且,我想提取的内容如下所示。

labelA stepA key1 value1 
labelB stepB key2 value2

但是,我的问题是两个RDD的大小非常大。因此,加入可能需要花费很多时间。我想避免使用join方法,并希望尽可能减少shuffle的大小。而且,收集一个RDD并使其成为广播变量因其大小而无法工作。请注意,RDD大小超过10千兆字节,这意味着驱动程序无法一次存储它们。

因此,有没有办法从两个大型RDD生成新的RDD?正如我上面提到的,我想避免使用join方法。

感谢。

1 个答案:

答案 0 :(得分:1)

假设您有3元组的RDD,这应该可以满足您的需求。

val left_rdd = rdd1
    .map{ case (key, value, label) => (key, value) -> label }
val right_rdd = rdd2
    .map{ case (step, key, value) => (key, value) -> step }
left_rdd.join(right_rdd)
    .map{ case ((key, value), (label, step)) => (label, step, key, value) }

你应该在假设它太长之前尝试一下。 10GB并不是那么大。应该避免随机播放如果可能的话。但有时候,这正是你所需要的。