展平RDD的密钥

时间:2016-08-15 18:07:20

标签: scala apache-spark flatmap

我有一个类型为(Array[breeze.linalg.DenseVector[Double]], breeze.linalg.DenseVector[Double])的Spark RDD。我希望压缩它的关键,将其转换为breeze.linalg.DenseVector[Double], breeze.linalg.DenseVector[Double])类型的RDD。我现在正在做:

val newRDD = oldRDD.flatMap(ob => anonymousOrdering(ob))

anonymousOrdering()的签名是String => (Array[DenseVector[Double]], DenseVector[Double])

返回type mismatch: required: TraversableOnce[?]。执行相同操作的Python代码是:

newRDD = oldRDD.flatMap(lambda point: [(tile, point) for tile in anonymousOrdering(point)])

如何在Scala中执行相同的操作?我通常使用flatMapValues,但在这里我需要弄平键。

2 个答案:

答案 0 :(得分:0)

更改代码以使用Map而不是FlatMap:

val newRDD = oldRDD.map(ob => anonymousOrdering(ob)).groupByKey()

如果anonymousOrdering返回了一个元组列表并且你希望它被展平,那么你只想在这里使用flatmap。

答案 1 :(得分:0)

由于anonymousOrdering()是您的代码中的函数,因此请更新它以返回Seq[(breeze.linalg.DenseVector[Double], breeze.linalg.DenseVector[Double])]。这就像在执行(tile, point) for tile in anonymousOrdering(point)]但直接在匿名函数的末尾。然后flatMap将为序列的每个元素创建一个分区。

作为一般规则,避免将集合作为RDD中的密钥。