我被一个特定的scala-spark语法卡住了,我希望您能引导我朝着正确的方向前进。
如果RDD1是数组类型(( Float,Float,Float),Long),
RDD1.collect =数组((x1,y1,z1),1),((x2,y2,z2),2),((x3,y3,y3),3),...)
RDD2是索引,类型为ArrayLong,
RDD2.collect =数组(1,3,5...)
从索引出现在RDD2中的RDD1中提取值的最佳方法是什么?即输出,数组((x1,y1,z1),1),((x3,y3,y3),3),(x5,y5,y5),5) ...)
RDD1和RDD2都足够大,所以我希望避免使用.collect。否则,问题就是在两个scala数组/列表中找到相交的元素。
非常感谢你的帮助!
发布于 2016-11-01 07:58:20
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 --它是一个相当丰富的应用程序接口,并且都使用RDD[(Key, Value)]。
https://stackoverflow.com/questions/40351833
复制相似问题