如何获取第n行的Spark RDD?
How to get nth row of Spark RDD?
假设我有一个任意对象的 RDD。我希望获得 RDD 的第 10(比如说)行。我该怎么做?
一种方法是使用rdd.take(n)然后访问第n个元素就是对象,但是当n很大时这种方法很慢。
我不知道它的效率如何,因为这取决于Spark引擎当前和未来的优化,但您可以尝试执行以下操作:
rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
第一个函数将 RDD 转换为一对 (value, idx),其中 idx 从 0 开始。第二个函数采用 idx==9 的元素(第 10 个)。第三个函数采用原始值。然后返回结果。
first 函数可以被执行引擎拉起并影响整个处理的行为。试一试。
在任何情况下,如果 n 非常大,这种方法是有效的,因为它不需要收集数组驱动程序节点中的前 n 个元素。
我还没有检查这个庞大的数据。但对我来说效果很好。
Lets say n=2, I want to access the 2nd element,
data.take(2).drop(1)
RDD.collect()
和 RDD.take(x)
都是 return 列表,支持索引。所以每次我们需要位置 N.We 的元素时,可以执行以下两个代码中的任何一个:
RDD.collect()[N-1]
要么
RDD.take(N)[N-1]
当我们想要位置 N.
的元素时会正常工作
假设我有一个任意对象的 RDD。我希望获得 RDD 的第 10(比如说)行。我该怎么做? 一种方法是使用rdd.take(n)然后访问第n个元素就是对象,但是当n很大时这种方法很慢。
我不知道它的效率如何,因为这取决于Spark引擎当前和未来的优化,但您可以尝试执行以下操作:
rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
第一个函数将 RDD 转换为一对 (value, idx),其中 idx 从 0 开始。第二个函数采用 idx==9 的元素(第 10 个)。第三个函数采用原始值。然后返回结果。
first 函数可以被执行引擎拉起并影响整个处理的行为。试一试。
在任何情况下,如果 n 非常大,这种方法是有效的,因为它不需要收集数组驱动程序节点中的前 n 个元素。
我还没有检查这个庞大的数据。但对我来说效果很好。
Lets say n=2, I want to access the 2nd element,
data.take(2).drop(1)
RDD.collect()
和 RDD.take(x)
都是 return 列表,支持索引。所以每次我们需要位置 N.We 的元素时,可以执行以下两个代码中的任何一个:
RDD.collect()[N-1]
要么
RDD.take(N)[N-1]
当我们想要位置 N.