选择RDD1的特定元素

时间:2016-10-31 23:02:07

标签: scala apache-spark rdd

我坚持使用特定的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数组/列表中找到相交元素。

非常感谢你的帮助!

1 个答案:

答案 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)]