Spark 如何跟踪 randomSplit 中的拆分



这个问题解释了Spark的随机拆分是如何工作的,Sparks RDD.randomSplit实际上是如何拆分RDD的,但我不明白spark如何跟踪哪些值进入一个拆分,以便这些相同的值不会进入第二次拆分。

如果我们看一下randomSplit的实现:

def randomSplit(weights: Array[Double], seed: Long): Array[DataFrame] = {
 // It is possible that the underlying dataframe doesn't guarantee the ordering of rows in its
 // constituent partitions each time a split is materialized which could result in
 // overlapping splits. To prevent this, we explicitly sort each input partition to make the
 // ordering deterministic.
 val sorted = Sort(logicalPlan.output.map(SortOrder(_, Ascending)), global = false, logicalPlan)
 val sum = weights.sum
 val normalizedCumWeights = weights.map(_ / sum).scanLeft(0.0d)(_ + _)
 normalizedCumWeights.sliding(2).map { x =>
  new DataFrame(sqlContext, Sample(x(0), x(1), withReplacement = false, seed, sorted))
}.toArray
}

我们可以看到它创建了两个共享相同 sqlContext 和两个不同 Sample(rs) 的数据帧。

这两个数据帧

如何相互通信,以便第一个数据帧中的值不包含在第二个数据帧中?

数据是否被获取两次?(假设 sqlContext 正在从数据库中选择,选择是否被执行了两次?

这与对RDD进行采样完全相同。

假设你有权重数组(0.6, 0.2, 0.2),Spark 将为每个范围生成一个数据帧(0.0, 0.6), (0.6, 0.8), (0.8, 1.0)

当需要读取结果数据帧时,Spark 将只遍历父数据帧。对于每个项目,生成一个随机数,如果该数字在指定范围内,则发出该项目。所有子数据帧共享相同的随机数生成器(技术上,具有相同种子的不同生成器),因此随机数序列是确定性的。

对于最后一个问题,如果您没有缓存父数据帧,则每次计算输出数据帧时,都会重新获取输入数据帧的数据。

相关内容

  • 没有找到相关文章

最新更新