2016-11-15 90 views
0

我正在使用PySpark,我正在寻找一种方法将RDD随机分为n个公平的部分。下式给出:randomSplit不尊重特定权重PySpark

RDD = sc.parallelize(range(50)) 

我的代码:

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) 

明知权重= [0.25,0.25,0.25,0.25],我的代码可以给为例(如RDD长度):

9 
19 
11 
11 

为什么randomSplit不尊重这里的权重?我想要例如12,12,12和14作为长度,或者12,12,13和13。什么是最有效的方法来做到这一点?谢谢 !

回答

0

等重不保证记录的数量相同。它只保证每个对象有相同的概率分配给一个特定的子集。

如果记录数很少,您会看到像这样的波动。这是正常的行为。

+0

LostInOverflow:谢谢,但没有真正的方法来衡量零部件? – DataAddicted

+0

具有良好的统计特性和良好的性能?可能不会。如果你真的需要这个,你可以通过随机键,zipWithIndex进行排序,并执行多个显式范围的过滤器。 – 2016-11-15 10:25:37