Hadoop 如何获得第n排Spark RDD?

Hadoop 如何获得第n排Spark RDD?,hadoop,apache-spark,rdd,Hadoop,Apache Spark,Rdd,假设我有一个任意对象的RDD。我希望拿到RDD的第十排(比如说)。我该怎么做? 一种方法是使用rdd.take(n),然后访问对象的第n个元素,但当n较大时,这种方法速度较慢 我不知道它的效率有多高,因为这取决于Spark引擎当前和未来的优化,但您可以尝试执行以下操作: rdd.zipWithIndex.filter(_._2==9).map(_._1).first() 第一个函数将RDD转换为一对(值,idx),idx从0开始。第二个函数获取idx==9的元素(第10个)。第三个函数接受原始

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

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

rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
第一个函数将RDD转换为一对(值,idx),idx从0开始。第二个函数获取idx==9的元素(第10个)。第三个函数接受原始值。然后返回结果

第一个函数可以被执行引擎拉上来,并影响整个处理的行为。试试看


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

我没有检查这一点以获取大量数据。但对我来说效果很好

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

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

当我们希望元素位于位置N时,它可以正常工作。

不幸的是,
zipWithIndex
需要对数据进行完整传递,以计算每个分区的索引偏移量。不过这可能仍是你最好的选择。我试过了,速度很慢。好吧,也许只排一行,但排几行,一次一行是很慢的,为什么这么难
.first
是第一行的全部内容。。。严肃的问题。我相信的答案也与此相关。您不希望对较大的
n
值执行此操作,因为这将导致获取驱动程序代码本身的第一个
n
元素(受分区影响…)。。。所以这可能是缓慢的,甚至是不可能的…同意。有什么有效的方法可以做到这一点吗?阿法克:尼古拉·费拉罗在上面的回答中包含了我们目前拥有的最佳方法。如果你想要第十亿排的话,那可不是个好主意。这会将整个RDD带到前端,这几乎总是错误的。
   data.take(2).drop(1)