我坚持使用特定的scala-spark语法,我希望你能指导我正确的方向。
如果RDD1是类型Array [((Float,Float,Float),Long)],
RDD1.collect = Array((x1,y1,z1),1),((x2,y2,z2),2),((x3,y3,y3),3),...)
和RDD2是索引,类型为Array [Long],
RDD2.collect = Array(1,3,5 ......)
从RDD1中提取其索引出现在RDD2中的值的最佳方法是什么?即, 输出,数组((x1,y1,z1),1),((x3,y3,y3),3),(x5,y5,y5),5)...)
RDD1和RDD2都足够大,我想避免使用.collect。否则,问题只是在2个scala数组/列表中找到相交元素。
非常感谢你的帮助!
答案 0 :(得分:1)
PairRDD上有一个join函数,这是你想在这里使用的。
// coming in, we have:
// rdd1: RDD[((Float, Float, Float), Long)]
// rdd2: RDD[Long]
val joinReadyRDD1 = rdd1.map { case (values, key) => (key, values) }
val joinReadyRDD2 = rdd1.map { key => (key, ()) }
val joined = joinReadyRDD1.join(joinReadyRDD2).mapValues(_._1)
这会返回RDD[(Long, (Float, Float, Float))]
,其中Long
键出现在rdd2
中。
旁注:如果你有一个概念性的"键"和"值",先把钥匙放好。看一下我上面链接的PairRDDFunctions - 它是一个非常丰富的API,它都使用RDD[(Key, Value)]
。