我有一个rdd:
val input = RDD[(Int, Iterable[(info1, info2)])]
我需要的是:
RDD[(Int, Array[info2])]
现在我正在尝试
val output = input.mapValue(ele => ???.toArray)
???我遇到了一些困难,我不知道怎样才能访问iterable中的元组并将它们中的每一个都带到一个数组中。或者我选择mapValue方法做错了什么?
答案 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)