gpt4 book ai didi

apache-spark - Spark 如何跟踪 randomSplit 中的拆分?

转载 作者:行者123 更新时间:2023-12-04 04:45:29 25 4
gpt4 key购买 nike

这个问题解释了 Spark 的随机拆分是如何工作的,How does Sparks RDD.randomSplit actually split the 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
}

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

这两个 DataFrame 如何相互通信,以便第一个中的值不包含在第二个中?

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

最佳答案

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

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

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

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

关于apache-spark - Spark 如何跟踪 randomSplit 中的拆分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38379522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com