如何获得Spark RDD的第n行?

时间:2015-01-07 18:30:15

标签: hadoop apache-spark rdd

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

在任何情况下,如果 n 非常大,此方法的效率很高,因为它不需要收集第一个 n的数组驱动程序节点中的元素。

答案 1 :(得分:7)

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

  

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

   data.take(2).drop(1)

答案 2 :(得分:0)

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