我有一个类型为(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
,但在这里我需要弄平键。
答案 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中的密钥。