只是想知道这到底是做什么的?我理解keyBy
,但我很难理解combineByKey
。我已阅读 (link)页,但仍然不了解。
df.rdd.keyBy(
lambda row: row['id']
).combineByKey(
lambda row: [row],
lambda rows, row: rows + [row],
lambda rows1, rows2: rows1 + rows2,
)
)
答案 0 :(得分:1)
简而言之,combineByKey允许您明确指定聚合(或减少)rdd的3个阶段。
<强> 1。当第一次遇到时,对单行做了什么?
在您提供的示例中,该行将放入列表中。
<强> 2。如果单行遇到先前减少的行,该怎么做?
在该示例中,先前缩减的行已经是一个列表,我们向其添加新行并返回新的扩展列表。
第3。对两个先前减少的行做了什么?
在上面的示例中,两个行都已经是列表,我们返回一个包含两个行的新列表。
更多,解释清楚,这些链接中提供了一步一步的示例:
第二个链接的关键解释是:
让我们看看combineByKey如何在我们的用例中工作。当combineByKey导航通过每个元素,即分区1 - (Messi,45)时,它有一个它以前没见过的键,当它移动到下一个键时(Messi,48),它得到一个它以前见过的键。当它第一次看到一个元素时,combineByKey()使用名为createCombiner的函数为该键创建累加器的初始值。即它使用梅西作为关键,使用45作为价值。因此,该密钥(Messi)的累加器的当前值变为45.现在,下一次combineByKey()在同一分区上看到相同的密钥,它不使用createCombiner,而是使用第二个函数mergeValue,其当前值为accumulator(45),新价值48。
由于所有这些在不同的分区中并行发生,因此存在 在其他分区上存在相同键的机会 蓄电池。所以来自不同分区的结果必须如此 合并它使用mergeCombiners函数。