相关疑难解决方法(0)

Spark:使用单键RDD加入2元组密钥RDD的最佳策略是什么?

我有两个我想加入的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.

有没有人遇到过这种情况?我很乐意有你的想法.

谢谢!

scala apache-spark

48
推荐指数
2
解决办法
5万
查看次数

标签 统计

apache-spark ×1

scala ×1