我有两个我想加入的RDD,它们看起来像这样:
val rdd1:RDD[(T,U)]
val rdd2:RDD[((T,W), V)]
Run Code Online (Sandbox Code Playgroud)
碰巧的是,键值rdd1是唯一的,并且元组键值rdd2是唯一的.我想加入这两个数据集,以便获得以下rdd:
val rdd_joined:RDD[((T,W), (U,V))]
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最有效方法是什么?以下是我想到的一些想法.
选项1:
val m = rdd1.collectAsMap
val rdd_joined = rdd2.map({case ((t,w), u) => ((t,w), u, m.get(t))})
Run Code Online (Sandbox Code Playgroud)
选项2:
val distinct_w = rdd2.map({case ((t,w), u) => w}).distinct
val rdd_joined = rdd1.cartesian(distinct_w).join(rdd2)
Run Code Online (Sandbox Code Playgroud)
选项1将收集掌握的所有数据,对吧?因此,如果rdd1很大(在我的情况下它相对较大,虽然比rdd2小一个数量级),这似乎不是一个好的选择.选项2做了一个丑陋的独特和笛卡尔产品,这似乎也非常低效.我想到的另一种可能性(但尚未尝试)是做选项1并广播地图,尽管以"智能"方式进行广播会更好,这样地图的按键与钥匙rdd2.
有没有人遇到过这种情况?我很乐意有你的想法.
谢谢!