如果我理解正确,您的问题归结为:
val valuesRdd = sc.parallelize(Seq(
//((x, y), v)
((0, 0), 5.5),
((1, 0), 7.7)
))
val indicesRdd = sc.parallelize(Seq(
//(index, Array[(x, y)])
(123, Array((0, 0), (1, 0)))
))
并且您想合并这些 RDD 以获取所有值 (index, (x, y), v),在本例中为 (123, (0,0), 5.5) 和 (123, (1,0), 7.7) ?
您绝对可以使用join 执行此操作,因为两个RDD 都有一个公共列(x, y),但由于其中一个实际上有一个Array[(x, y)],您必须先将其分解为一组行:
val explodedIndices = indicesRdd.flatMap{case (index, coords: Array[(Int, Int)]) => coords.map{case (x, y) => (index, (x, y))}}
// Each row exploded into multiple rows (index, (x, y))
val keyedIndices = explodedIndices.keyBy{case (index, (x, y)) => (x, y)}
// Each row keyed by the coordinates (x, y)
val keyedValues = valuesRdd.keyBy{case ((x, y), v) => (x, y)}
// Each row keyed by the coordinates (x, y)
// Because we have common keys, we can join!
val joined = keyedIndices.join(keyedValues)