【发布时间】:2015-03-05 17:51:35
【问题描述】:
假设我有一个任意对象的 RDD。我希望得到 RDD 的第 10 行(比如说)。我该怎么做? 一种方法是使用 rdd.take(n) 然后访问第 n 个元素是对象,但是当 n 很大时这种方法很慢。
【问题讨论】:
-
我相信this question的答案在这里也很重要。
标签: hadoop apache-spark rdd
假设我有一个任意对象的 RDD。我希望得到 RDD 的第 10 行(比如说)。我该怎么做? 一种方法是使用 rdd.take(n) 然后访问第 n 个元素是对象,但是当 n 很大时这种方法很慢。
【问题讨论】:
标签: hadoop apache-spark rdd
我不知道它的效率有多高,因为它取决于 Spark 引擎中当前和未来的优化,但您可以尝试执行以下操作:
rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
第一个函数将 RDD 转换为一对 (value, idx),其中 idx 从 0 开始。第二个函数采用 idx==9(第 10 个)的元素。第三个函数取原始值。然后返回结果。
first 函数可以被执行引擎拉起并影响整个处理的行为。试试看吧。
在任何情况下,如果 n 是非常大,这种方法是有效的,因为它不需要收集第一个 n 的数组em> 驱动节点中的元素。
【讨论】:
zipWithIndex 需要对数据进行完整传递才能计算每个分区的索引偏移量。不过,它仍然可能是您最好的选择。
.first 是第一行的全部内容......严肃的问题。
我还没有检查过这个庞大的数据。但它对我来说很好。
假设 n=2,我想访问第二个元素,
data.take(2).drop(1)
【讨论】:
n 值执行此操作,因为它会导致将第一个n 元素(受分区影响...)获取到驱动程序代码本身......所以它可能很慢甚至不可能......
RDD.collect() 和RDD.take(x) 都返回一个支持索引的列表。所以每次我们需要一个元素在位置 N. 我们可以执行以下两个代码中的任何一个:
RDD.collect()[N-1]
要么
RDD.take(N)[N-1]
当我们希望元素位于位置 N 时会正常工作。
【讨论】: