Spark - Take和Subtract

时间:2016-09-06 10:55:13

标签: apache-spark pyspark bigdata

有没有有效的方法从RDD中取出前1000个项目,并从RDD中删除它们?

目前我正在做的是:

small_array = big_sorted_rdd.take(1000)
big_sorted_rdd_without_small_array = big_sorted_rdd.subtract(
    sc.parallize(small_array))

2 个答案:

答案 0 :(得分:0)

这不是一件直截了当的事情,因为RDD是分布式的(如名称所示),因此定义1000个第一项并非直截了当。

然而,除了你的建议之外,还有其他方法可以实现你正在做的事情。

首先,您可以定义项目的排序,例如将每个项目转换为元组:(数字,项目),其中数字从1到#元素。然后在RDD上使用过滤器来剪切前X个项目:

big_rdd.filter(_._1 > 1000)

第二个想法,我需要摆脱X第一个元素的时间是对项目执行迭代计算(我记得曾经尝试减少系统上的负载)。所以你可以做的是将你的数据分成每个块中的1000个元素的一部分,然后一次取一个块并对其进行计算,使RDD看起来像这样:

RDD[(chunkNumber, List[elements])]

然后你每次都会处理1000个元素,进一步考虑这个想法你可以使你的数据集看起来像这样:

Array[RDD[elements]]

然后每次处理1000个元素的RDD(迭代数组)

答案 1 :(得分:0)

val zippedRDD = rdd.zipWithIndex()

val neededRDD = rdd.filter(t => t._2< 1000)

val unNeededRDD = rdd.filter(t => t._2> = 1000)