在Spark Scala框架中,我有一个RDD rdd1
,其中每个元素代表一个矩阵A
的单个元素:
val rdd1 = dist.map{case (((x,y),z,v)) => ((x,y),v)}
x
表示行,
y
代表列和
v
代表矩阵A
中的值。
我还有另一个RDD rdd2
,形式为RDD[index, Array[(x, y)]]
,其中每个元素中的数组表示矩阵A
的元素集,它们存储在{{} 1}},是该元素中表示的特定rdd1
所必需的。
现在我需要做的是获取每个index
的矩阵A
元素的值,保留所有数据,包括index
,index
和{{1 }}。这样做有什么好办法?
答案 0 :(得分:1)
如果我理解正确,你的问题归结为:
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)