2016-11-15 5 views
0

私はPySparkを使用していますが、ランダムにRDDをn個の公平な部分に分割する方法を探しています。randomSplitは特定の重みを尊重しませんPySpark

RDD = sc.parallelize(range(50)) 

マイコード:所与= [0.25、0.25、0.25、0.25]重みは、自分のコードは、(RDDが長として)exempleために与えることができることを知っ

from itertools import repeat 

def split_population_into_parts(rdd): 

    N = 4 

    weight_part = float(1)/float(N) 

    weights_list = list(repeat(weight_part, N)) 

    repartionned_rdd = rdd.randomSplit(weights = weights_list) 

    #And just to check what weights give, I did : 
    for i in repartionned_rdd: 

     print len(i.collect()) 


split_population_into_parts(rdd = RDD) 

9 
19 
11 
11 

なぜrandomSplitはここで重みを尊重しませんでしたか?私は、例えば、12,12,12,14の長さを持っているか、12,12,13,13としたいと思っています。これを行う最も効率的な方法は何ですか?ありがとうございました !

答えて

0

等しい重みは、同じ数のレコードを保証するわけではありません。各オブジェクトが特定のサブセットに割り当てられる確率が等しいことを保証するだけです。

レコード数が少ない場合は、ここのような変動が見られます。これは正常な動作です。

+0

LostInOverflow:ありがとうございますが、実際に公平な部品を用意する方法はありませんか? – DataAddicted

+0

良好な統計的性質と適切なパフォーマンスを備えていますか?おそらくそうではありません。ランダムキー、zipWithIndexでソートし、本当に必要な場合は明示的な範囲で複数のフィルターを実行できます。 –

関連する問題