2017-03-19 51 views
-1

我有一個RDD:如何在火花中操作這個Iterable?

val input = RDD[(Int, Iterable[(info1, info2)])] 

我需要的是:

RDD[(Int, Array[info2])] 

現在我想

val output = input.mapValue(ele => ???.toArray) 

???是我有困難,我不我不知道如何才能訪問迭代內的元組,並且只將它們中的每一個都帶到數組中。或者我選擇mapValue方法做錯了什麼?

+0

在ele._2的地方嗎?工作? – Tanjin

+0

不,我已經在 –

+0

之前試過了,爲什麼你想和Array在最後一步? Seq不好嗎? – angelcervera

回答

1

如果不需要數組作爲一個結果,而這是確定與任何類型的序列,也許這是確定的東西是這樣的:

定數據集的這個例子:

val inputrdd = sc.parallelize(Seq((1, Iterable((101,102))), (2, Iterable((201,202))), (3, Iterable((301,302))))) 

您可以使用這樣的mapValue:

inputrdd.mapValues(iter => iter.map(_._2)) 

也就是說它相當於:

inputrdd.map{case(k,iter)=>(k,iter.map(_._2))} 

iter是可迭代的對象,它在map(_._2)中,其中取出元組的第二部分。

在這一點上,你現在如何訪問和操縱迭代。如果你需要,強制一個陣列,你可以做到這一點:

inputrdd.mapValues(iter => iter.map(_._2).toArray) 
+0

thx,我必須使用數組作爲結果,但mapValue不是強制性的。 –

+0

@XinlinFeng我更新了將該類型強制爲一個數組的響應,但想一想。使用Seq有更高的抽象級別會更好。斯卡拉將爲您使用最好的實施。 – angelcervera

+0

thx,我會考慮改變類型,我只是scala的初學者 –