我知道RDD有样本'返回包含随机选择的原始RDD的给定部分的新RDD的方法。但是,由于每个元素是随机选择的,因此新RDD的大小不是确定性的。 还有' takeSample'返回RDD的输入整数个元素的方法。但是,这会返回一个列表而不是一个新的RDD。
是否有一种方法可以返回具有指定精确数量的随机选择元素的RDD?当然可以使用takeSample并从中创建一个新的RDD,但这意味着在驱动程序和执行程序之间来回发送大量数据。
答案 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()