gpt4 book ai didi

python - 谁能对Spark中的 `combineByKey`给出一个明确的解释?

转载 作者:太空狗 更新时间:2023-10-30 00:39:30 24 4
gpt4 key购买 nike

我正在学习spark,但是我无法理解combineByKey这个函数。

>>> data = sc.parallelize([("A",1),("A",2),("B",1),("B",2),("C",1)] )
>>> data.combineByKey(lambda v : str(v)+"_", lambda c, v : c+"@"+str(v), lambda c1, c2 : c1+c2).collect()

输出是:

[('A', '1_2_'), ('C', '1_'), ('B', '1_2_')]

首先,我很困惑:第二步 lambda c, v : c+"@"+v 中的 @ 在哪里?我无法从结果中找到 @

其次,我阅读了combineByKey的函数描述,但我对算法流程感到困惑。

最佳答案

groupByKey 调用不会尝试合并/合并值,因此这是一个开销很大的操作。

因此 combineByKey 调用就是这样一种优化。当使用 combineByKey 时,值在每个分区合并为一个值,然后每个分区值合并为一个值。值得注意的是,组合值的类型不必与原始值的类型匹配,而且通常情况下不会。 combineByKey 函数接受 3 个函数作为参数:

  1. 创建组合器的函数。在 aggregateByKey 函数中,第一个参数只是一个初始零值。在 combineByKey 中,我们提供了一个函数,它将接受当前值作为参数并返回将与其他值合并的新值。

  2. 第二个函数是一个合并函数,它获取一个值并将其合并/组合到之前收集的值中。

  3. 第三个函数将合并后的值组合在一起。基本上,此函数采用在分区级别生成的新值并将它们组合起来,直到我们最终得到一个奇异值。

换句话说,要理解 combineByKey,思考它如何处理它所处理的每个元素是很有用的。当 combineByKey 遍历分区中的元素时,每个元素要么有一个以前没有见过的键,要么有与前一个元素相同的键。

如果它是一个新元素,combineByKey 使用我们提供的函数,称为 createCombiner(),为该键上的累加器创建初始值。重要的是要注意,这发生在第一次在每个分区中找到键时,而不是仅在第一次在 RDD 中找到键时。

如果它是我们之前在处理该分区时看到的值,它将改为使用提供的函数 mergeValue(),该键的累加器的当前值和新值.

由于每个分区都是独立处理的,我们可以为同一个键设置多个累加器。当我们合并每个分区的结果时,如果两个或多个分区具有相同键的累加器,我们将使用用户提供的 mergeCombiners() 函数合并累加器。

引用资料:

关于python - 谁能对Spark中的 `combineByKey`给出一个明确的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33937625/

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