如果我具有以下功能,并且想使用数组Var1
将Iterable拆分为Var2
的RDD,那么最好的方法是什么?
这是我的功能:
def foo(rdds: RDD[(ID, Iterable[(Var1,Var2)])]) : RDD[(Var1,Array[Var2])] = {
rdds.map(x => (x._2.map(it => it._1).asInstanceOf[Var1], (x._2.map(it => it._2).toArray)))
}
这是我的样本的输入数据:
//RDD[(ID, Iterable[(Var1,Var2)...])]
RDD[("ID1",Iterable[(1,4),(1,8),(1,15)])],
RDD[("ID2",Iterable[(2,18),(2,29)])]
我希望输出看起来像这样:
//RDD[(Var1,Array[Var2])]
RDD[1,(4,8,15)],
RDD[2,(18,29)]
虽然我上面的代码有效。似乎没有必要遍历x._2
两次才能获得Iterable的两个部分,而且我不喜欢必须显式执行asInstanceOf[Var1]
转换以更改Iterable类型的方式。
时有更好的方法来提取了Iterable的元件和将它们放置在由分组的新RDD Var1
?
答案 0 :(得分:1)
您可以更改获取var1
的方式。根据您显示的数据,var1
中的Iterable
值是相同的。因此,无需遍历Iterable
两次。您可以执行以下操作:
def foo(rdds: RDD[(ID, Iterable[(Var1,Var2)])]) : RDD[(Var1,Array[Var2])] = {
rdds.map(x => (x._2.head._1, (x._2.map(it => it._2).toArray)))
}
这将给所需的结果。
注 - 这仅当x._2
具有ATLEAST一个元件存在。如果x._2
可能为空,那么x._2.headOption.getOrElse((defaultVar1, defaultVar2))._1
可能是个好主意。