假设我有一个任意对象的RDD。我希望获得RDD的第10行(比如说)。我该怎么办? 一种方法是使用rdd.take(n)然后访问第n个元素是对象,但是当n很大时这种方法很慢。
答案 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时,它将正常工作。