2017-08-02 131 views
0

我知道RDD有'sample'方法,它返回一個新的RDD,它包含隨機選擇的原始RDD的給定部分。但是,隨着每個元素被隨機選擇,新RDD的大小不確定。 還有'takeSample'方法,它返回RDD元素的輸入整數。但是,這會返回一個列表而不是新的RDD。Spark中是否有方法獲得RDD,RDD是另一個RDD的給定確切大小的隨機子集?

有沒有一種方法可以返回RDD與指定的確切數量的隨機選擇的元素?當然,我們可以使用takeSample並從中創建一個新的RDD,但這意味着在驅動程序和執行程序之間來回發送大量數據。

+1

我將結合近似,尺寸略大。樣品(使用比例的.count)與一個簡單的.limit,以切斷目標大小以上的任何元素。如果你足夠接近你的目標大小,切斷一些零散的人應該不會對結果產生重大的統計影響。 –

回答

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