如何获得Spark RDD的第n行?

问题描述 投票:8回答:3

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

hadoop apache-spark rdd
3个回答
9
投票

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

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

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

第一个函数可以由执行引擎提取并影响整个处理的行为。试试看。

在任何情况下,如果n非常大,则该方法是有效的,因为它不需要收集驱动器节点中前n个元素的数组。


7
投票

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

让我们说n = 2,我想访问第二个元素,

   data.take(2).drop(1)

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.