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