如何在火花中操纵这个Iterable?

时间:2017-03-19 06:48:03

标签: scala apache-spark iterable

我有一个rdd:

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

我需要的是:

RDD[(Int, Array[info2])]

现在我正在尝试

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

???我遇到了一些困难,我不知道怎样才能访问iterable中的元组并将它们中的每一个都带到一个数组中。或者我选择mapValue方法做错了什么?

1 个答案:

答案 0 :(得分:1)

如果你不需要一个数组,并且可以使用任何类型的Seq,也许这样就可以了:

鉴于此数据集示例:

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)