对于具有结构(键,值)的一个大型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的方法吗?
有人可以给我一些建议吗?
答案 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()
,都被认为是“地图端连接”,并且可以作为一种减少混洗开销的有效方法,无论如何以后都会将其滤除。