我有两个大尺寸的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方法。
感谢。
答案 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并不是那么大。应该避免随机播放如果可能的话。但有时候,这正是你所需要的。