Sparks RDD.randomSplit 实际上是如何拆分 RDD 的

How does Sparks RDD.randomSplit actually split the RDD

所以假设我有一个 3000 行的 rdd。前 2000 行属于 class1,后 1000 行属于 class2。 RDD 分为 100 个分区。

调用时RDD.randomSplit(0.8,0.2)

函数是否也对 rdd 进行 shuffle?我们的拆分只是简单地连续采样 rdd 的 20% 吗?还是 select 20% 的分区是随机的?

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

谢谢

对于由 weights 数组定义的每个范围,都有一个单独的 mapPartitionsWithIndex 保留分区的转换。

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

  • 不洗牌 RDD
  • 除非偶然,否则不会采取连续的方块
  • 从每个分区中随机抽样
  • 采用非重叠样本
  • 需要 n-splits 传递数据