`combineByKey`,pyspark

时间:2018-04-27 21:55:21

标签: python apache-spark pyspark

只是想知道这到底是做什么的?我理解keyBy,但我很难理解combineByKey。我已阅读 (link)页,但仍然不了解。

df.rdd.keyBy(
        lambda row: row['id']
    ).combineByKey(
        lambda row: [row],
        lambda rows, row: rows + [row],
        lambda rows1, rows2: rows1 + rows2,
    )
)

1 个答案:

答案 0 :(得分:1)

简而言之,combineByKey允许您明确指定聚合(或减少)rdd的3个阶段。

<强> 1。当第一次遇到时,对单行做了什么?

在您提供的示例中,该行将放入列表中。

<强> 2。如果单行遇到先前减少的行,该怎么做?

在该示例中,先前缩减的行已经是一个列表,我们向其添加新行并返回新的扩展列表。

第3。对两个先前减少的行做了什么?

在上面的示例中,两个行都已经是列表,我们返回一个包含两个行的新列表。

更多,解释清楚,这些链接中提供了一步一步的示例:

http://hadoopexam.com/adi/index.php/spark-blog/90-how-combinebykey-works-in-spark-step-by-step-explaination

http://etlcode.com/index.php/blog/info/Bigdata/Apache-Spark-Difference-between-reduceByKey-groupByKey-and-combineByKey

第二个链接的关键解释是:

enter image description here

  

让我们看看combineByKey如何在我们的用例中工作。当combineByKey导航通过每个元素,即分区1 - (Messi,45)时,它有一个它以前没见过的键,当它移动到下一个键时(Messi,48),它得到一个它以前见过的键。当它第一次看到一个元素时,combineByKey()使用名为createCombiner的函数为该键创建累加器的初始值。即它使用梅西作为关键,使用45作为价值。因此,该密钥(Messi)的累加器的当前值变为45.现在,下一次combineByKey()在同一分区上看到相同的密钥,它不使用createCombiner,而是使用第二个函数mergeValue,其当前值为accumulator(45),新价值48。

     

由于所有这些在不同的分区中并行发生,因此存在   在其他分区上存在相同键的机会   蓄电池。所以来自不同分区的结果必须如此   合并它使用mergeCombiners函数。