Spark中有一种方法可以获得RDD,它是另一个RDD的给定精确大小的随机子集吗?

时间:2017-08-02 10:15:19

标签: apache-spark pyspark

我知道RDD有样本'返回包含随机选择的原始RDD的给定部分的新RDD的方法。但是,由于每个元素是随机选择的,因此新RDD的大小不是确定性的。 还有' takeSample'返回RDD的输入整数个元素的方法。但是,这会返回一个列表而不是一个新的RDD。

是否有一种方法可以返回具有指定精确数量的随机选择元素的RDD?当然可以使用takeSample并从中创建一个新的RDD,但这意味着在驱动程序和执行程序之间来回发送大量数据。

1 个答案:

答案 0 :(得分:0)

价格昂贵但你可以按随机数排序:

import os
import binascii
import random

rdd  = spark.sparkContext.range(100)

def with_rand(iter):
    random_ = random.Random(int(binascii.hexlify(os.urandom(4)), 16))
    for x in iter:
        yield random_.random(), x

rdd_sorted = rdd.mapPartitions(with_rand).sortByKey()

删除随机数,添加索引和过滤

n = 42

result = rdd_sorted.values().zipWithIndex().filter(lambda x: x[1] < n).keys()