Spark中是否有一种方法可以获取RDD,RDD是另一个RDD的随机子集,具有给定的确切大小?



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

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

它会很昂贵,但您可以按随机数排序:

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()

最新更新