【问题标题】:How to manipulate this Iterable in spark?如何在火花中操纵这个Iterable?
【发布时间】:2017-08-10 13:25:38
【问题描述】:

我有一个rdd:

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

我需要的是:

RDD[(Int, Array[info2])]

我正在尝试

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

???是我遇到的困难,我不知道如何才能访问可迭代内部的元组,并且只将它们中的每一个带到一个数组中。还是我选择 mapValue 方法做错了什么?

【问题讨论】:

  • ele._2 代替 ???工作吗?
  • 不,我已经试过了
  • 最后一步为什么要和Array?用 Seq 不行吗?

标签: scala apache-spark iterable


【解决方案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)

【讨论】:

  • thx,结果我必须使用数组,但 mapValue 不是强制性的。
  • @XinlinFeng 我更新了将类型强制为数组的响应,但请考虑一下。最好使用 Seq 具有更高的抽象级别。 Scala 将为您使用最好的实现。
  • thx,我会考虑改变类型,我只是 scala 的初学者
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多