Spark:根据另一个RDD中的数组元素获取RDD的元素

时间:2016-09-15 21:31:21

标签: scala apache-spark rdd

在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元素的值,保留所有数据,包括indexindex和{{1 }}。这样做有什么好办法?

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)