如何理解 Spark 中的 reduceByKey?

How to understand reduceByKey in Spark?

我正在尝试学习 Spark,到目前为止进展顺利,除了我需要在值为列表的 RDD 对上使用 reduceByKey 或 combineByKey 等函数的问题。

我一直在努力寻找这些函数的详细文档,这些文档可以解释实际的参数是什么,这样我就可以自己解决它而不必去 Stack Overflow,但我就是找不到任何关于 Spark 的好的文档。 Learning Spark的第三章和第四章我都看过了,但是说实话,最复杂的函数解释的很烂

我现在要处理的问题如下:我有一对 RDD,其中键是一个字符串,值是两个元素的列表,这两个元素都是整数。像这样:(国家,[小时,计数])。对于每个键,我希望只保留计数最高的值,而不考虑时间。一旦我有了上述格式的 RDD,我就会尝试通过在 Spark 中调用以下函数来找到最大值:

reduceByKey(lambda x, y: max(x[1], y[1]))

但这会引发以下错误:

TypeError: 'int' object is not subscriptable

这对我来说没有任何意义。我将参数 x 和 y 解释为两个键的值,例如x=[13, 445] 和 y=[14, 109],但错误没有任何意义。我做错了什么?

假设您有 [("key", [13,445]), ("key", [14,109]), ("key", [15,309])]

当它传递给 reduceByKey 时,它将 将具有相同键的所有值分组到一个执行器中 [13,445], [14,109], [15,309] 并在值之间迭代

在第一次迭代中,x[13,445]y[14,109],输出是 max(x[1], y[1]),即 max(445, 109),即 445

在第二次迭代中 x445,即前一个循环的 maxy[15,309]

现在当 x 的第二个元素试图通过 x[1] 获取并且 445 只是一个 integer 时, 出现错误

TypeError: 'int' object is not subscriptable

我希望错误的意思是清楚的。您可以在我的

中找到更多详细信息

上面的解释也解释了为什么@pault在评论区提出的方案有效,即

reduceByKey(lambda x, y: (x[0], max(x[1], y[1])))