2016-08-15 95 views
0

我有一个类型为(Array[breeze.linalg.DenseVector[Double]], breeze.linalg.DenseVector[Double])的Spark RDD。我希望将它的关键字平坦化,将其转换为类型为breeze.linalg.DenseVector[Double], breeze.linalg.DenseVector[Double])的RDD。我目前在做:拼合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

你能指定'anonymousOrdering'的签名吗?同样在扁平化之后,RDD的类型在你的问题中是相同的。那是故意的吗? –

+0

添加了签名(注释在第一个片段中),我的意图是将包含(Array(1,2),3)的RDD转换为包含(1,3)|的RDD。 (2,3)。在这个例子中,我用整数代替了DenseVector类型。 –

回答

2

如果我正确理解你的问题,你可以这样做:

val newRDD = oldRDD.flatMap(ob => anonymousOrdering(ob)) 
// newRDD is RDD[(Array[DenseVector], DenseVector)] 

在这种情况下,你可以使用模式匹配和for/yield声明“扁平化”的元组的Array部分

newRDD = newRDD.flatMap{case (a: Array[DenseVector[Double]], b: DenseVector[Double]) => for (v <- a) yield (v, b)} 
// newRDD is RDD[(DenseVector, DenseVector)] 

虽然它仍然不是很清楚,我在那里/你要如何使用groupByKey

+0

我正在删除地图末尾的groupByKey(),因为它与问题无关。感谢你的回答。 –

+0

val newRDD = oldRDD.flatMap(ob => anonymousOrdering(ob))返回'found:(Array [breeze.linalg.DenseVector [Double]],bre​​eze.linalg.DenseVector [Double]),必需:TraversableOnce [?]' –

+1

看起来像问题是在'anonymousOrdering'然后...看到这里:http://stackoverflow.com/questions/30833618/how-do-i-flatmap-a-row-of-arrays-into-multiple-行 – spiffman

0

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

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

你只希望如果anonymousOrdering返回一个元组列表,你想让它变平下来在这里使用flatmap。

+0

映射将返回一个类型为Array(Array [breeze.linalg.DenseVector [Double]],bre​​eze.linalg.DenseVector [Double])的RDD,我想平坦化元组的第一部分。 –

+0

你可以发布anonymousOrdering的函数签名吗? –

+0

问题已更新,现在低于第一个片段。 –

0

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

作为一般规则,避免将集合作为RDD中的关键字。

+0

你问了如何弄平一把钥匙,我回答了,并且你接受了我的回答,但随后你为你的代码做了一个解决方法,这样你就不必再把钥匙弄平,并且接受你的解决方法作为“解决方案”。 。你也从未发布过带有实际问题的'anonymousOrdering'的内容。坏形式! – spiffman

+0

我再次接受了你的答案,但它没有奏效,真正的答案只是没有将数组作为关键字的RDD。 –