【问题标题】:How to get nth row of Spark RDD?如何获得第 n 行 Spark RDD?
【发布时间】:2015-03-05 17:51:35
【问题描述】:

假设我有一个任意对象的 RDD。我希望得到 RDD 的第 10 行(比如说)。我该怎么做? 一种方法是使用 rdd.take(n) 然后访问第 n 个元素是对象,但是当 n 很大时这种方法很慢。

【问题讨论】:

标签: hadoop apache-spark rdd


【解决方案1】:

我不知道它的效率有多高,因为它取决于 Spark 引擎中当前和未来的优化,但您可以尝试执行以下操作:

rdd.zipWithIndex.filter(_._2==9).map(_._1).first()

第一个函数将 RDD 转换为一对 (value, idx),其中 idx 从 0 开始。第二个函数采用 idx==9(第 10 个)的元素。第三个函数取原始值。然后返回结果。

first 函数可以被执行引擎拉起并影响整个处理的行为。试试看吧。

在任何情况下,如果 n非常大,这种方法是有效的,因为它不需要收集第一个 n 的数组em> 驱动节点中的元素。

【讨论】:

  • 不幸的是,zipWithIndex 需要对数据进行完整传递才能计算每个分区的索引偏移量。不过,它仍然可能是您最好的选择。
  • 我试过了,速度很慢。好吧,也许可以得到一排,但是得到几行,一次一个很慢
  • 为什么这么难? .first 是第一行的全部内容......严肃的问题。
【解决方案2】:

我还没有检查过这个庞大的数据。但它对我来说很好。

假设 n=2,我想访问第二个元素,

   data.take(2).drop(1)

【讨论】:

  • 您不希望对较大的n 值执行此操作,因为它会导致将第一个n 元素(受分区影响...)获取到驱动程序代码本身......所以它可能很慢甚至不可能......
  • 同意。有什么有效的方法吗?
  • AFAIK:上面 Nicola Ferraro 的回答包含我们目前拥有的最佳方法。 stackoverflow.com/a/27826498/2846609
【解决方案3】:

RDD.collect()RDD.take(x) 都返回一个支持索引的列表。所以每次我们需要一个元素在位置 N. 我们可以执行以下两个代码中的任何一个: RDD.collect()[N-1] 要么 RDD.take(N)[N-1] 当我们希望元素位于位置 N 时会正常工作。

【讨论】:

  • 如果您想要第 10 亿行,那是个坏主意。这会将整个 RDD 带到前端,这几乎总是错误的做法。
猜你喜欢
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多