2016-08-15 62 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。 –