【问题标题】:Best way to extract from an RDD Iterable in Scala从Scala中的RDD Iterable中提取的最佳方法
【发布时间】:2019-06-26 16:31:27
【问题描述】:

如果我有以下函数,并且我想将 Iterable 拆分为 Var1 的 RDD 和 Var2 的数组,那么最好的方法是什么?

这是我的功能:

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 中提取元素并将它们放入由Var1 分组的新 RDD 中?

【问题讨论】:

  • 愿意评论/接受我的回答吗? @EliSquared

标签: scala rdd iterable


【解决方案1】:

您可以更改获取var1 的方式。根据您显示的数据,Iterable 中的var1 值是相同的。所以不需要重复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 至少存在一个元素时有效。如果x._2 有可能为空,那么x._2.headOption.getOrElse((defaultVar1, defaultVar2))._1 可能是个好主意。

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2012-02-09
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多