我有一個RDD:如何在火花中操作這個Iterable?
val input = RDD[(Int, Iterable[(info1, info2)])]
我需要的是:
RDD[(Int, Array[info2])]
現在我想
val output = input.mapValue(ele => ???.toArray)
???是我有困難,我不我不知道如何才能訪問迭代內的元組,並且只將它們中的每一個都帶到數組中。或者我選擇mapValue方法做錯了什麼?
我有一個RDD:如何在火花中操作這個Iterable?
val input = RDD[(Int, Iterable[(info1, info2)])]
我需要的是:
RDD[(Int, Array[info2])]
現在我想
val output = input.mapValue(ele => ???.toArray)
???是我有困難,我不我不知道如何才能訪問迭代內的元組,並且只將它們中的每一個都帶到數組中。或者我選擇mapValue方法做錯了什麼?
如果不需要數組作爲一個結果,而這是確定與任何類型的序列,也許這是確定的東西是這樣的:
定數據集的這個例子:
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)
thx,我必須使用數組作爲結果,但mapValue不是強制性的。 –
@XinlinFeng我更新了將該類型強制爲一個數組的響應,但想一想。使用Seq有更高的抽象級別會更好。斯卡拉將爲您使用最好的實施。 – angelcervera
thx,我會考慮改變類型,我只是scala的初學者 –
在ele._2的地方嗎?工作? – Tanjin
不,我已經在 –
之前試過了,爲什麼你想和Array在最後一步? Seq不好嗎? – angelcervera