谁能在Spark中为`combineByKey`提供清晰的解释?

发布于 2021-01-29 17:35:50

我正在学习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,但对算法流程感到困惑。

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    groupByKey调用不会尝试合并/合并值,因此这是一项昂贵的操作。

    因此,combineByKey调用就是这样的优化。当使用combineByKey值在每个分区上合并为一个值时,则每个分区值将合并为单个值。值得注意的是,合并值的类型不必与原始值的类型匹配,并且通常不需要。该combineByKey函数以3个函数作为参数:

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

    2. 第二个函数是合并函数,它采用一个值并将其合并/合并为以前收集的值。

    3. 第三个功能将合并的值组合在一起。基本上,此函数采用在分区级别产生的新值并将其组合,直到最终得到一个奇异值。

    换句话说,要理解combineByKey,考虑一下它如何处理所处理的每个元素很有用。如combineByKey通过在一个分区中的元素进入,每个元件或者具有它之前还没有看到一个键或具有相同的密钥作为前一个元素。

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

    如果它是我们在处理该分区时以前见过的值,它将使用提供的函数,mergeValue()该键的累加器的当前值和新值。

    由于每个分区都是独立处理的,因此对于同一个密钥,我们可以有多个累加器。当我们合并每个分区的结果时,如果两个或多个分区具有同一键的累加器,我们将使用用户提供的mergeCombiners()功能合并累加器。

    参考文献:



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看