广播联接从同一大型RDD生成所有成对的元组,而没有重复项

时间:2018-06-20 00:04:35

标签: scala apache-spark

对于具有结构(键,值)的一个大型RDD,我想生成所有元组(键1,键2,值1,值2),其中不应该存在重复项或自对。即,(key1,key2,value1,value2)和(key2,key1,value2,value1)被视为重复项。

在SQL世界中,人们会执行类似的操作

SELECT A.key, B.key 
FROM TABLE1 as A CROSS JOIN TABLE1 as B
WHERE A.key < B.key

但是对于我的spark数据集,交叉联接(笛卡尔坐标)计算起来太昂贵了。

如何通过使用广播联接并应用key1> key2的条件来生成所有所需的元组?

就代码而言,假设RDD设置的元素类型为(键,值):

val broadcastSet = spark.broadcast(set.collect().toMap)
val result = set.map { (k,v) => { **???** } }

其中 ??? 是一种遍历broadcastSet中所有值并应用顺序条件key1> key2的方法吗?

有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

通常,当您要发出比集合中的记录多或少的记录时,可以使用{to:"/"}。这样的东西(未经测试的代码)应该可以工作:

.flatMap()

此模式(无论是val result = set.flatMap { (k1,v1) => { broadcastSet.value.flatMap { (k2,v2) => { if (k1 > k2) { Some(k1, k2, v1, v2) } else { None } }} }} 还是.flatMap(),都被认为是“地图端连接”,并且可以作为一种减少混洗开销的有效方法,无论如何以后都会将其滤除。