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 传递数据
所以假设我有一个 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 传递数据