从RDD可迭代斯卡拉最好的方式来提取

时间:2019-02-02 06:35:27

标签: scala rdd iterable

如果我具有以下功能,并且想使用数组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

1 个答案:

答案 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可能是个好主意。