2015-10-04 45 views
11

因此,假设我得到了一个3000行的rdd。 2000年的第一行是第一类,最后的1000行是第二类。 RDD跨100个分区进行分区。Sparks RDD.randomSplit如何实际拆分RDD

当调用RDD.randomSplit(0.8,0.2)

是否函数还洗牌RDD?我们的分裂只是简单地抽样了20%的RDD?或者它是否随机选择20%的分区?

理想情况下,产生的拆分与原始RDD具有相同的类分布。 (即2:1)

由于

回答

18

对于由weights阵列定义的每个范围有一个单独的mapPartitionsWithIndex变换其保留分区。

使用一组BernoulliCellSamplers对每个分区进行采样。对于每个分割,它迭代给定分区的元素,并在下一个随机Double的值处于由归一化权重定义的给定范围内时选择项目。给定分区的所有采样器都使用相同的RNG种子。这意味着它:

  • 不洗牌RDD
  • 不采取其他连续块比偶然
  • 需要从每个分区
  • 需要的随机样本的非重叠采样
  • 要求n分裂通过数据