如何理解Spark中的reduceByKey?

Ali*_*afa 0 python documentation functional-programming apache-spark pyspark

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

我一直在尝试找到这些函数的详细文档,这些文档可以解释参数的实际含义,这样我就可以自己解决它,而无需去 Stack Overflow,但我就是找不到任何好的 Spark 文档。我读过《Learning Spark》的第3章和第4章,但说实话,对于最复杂的函数的解释非常糟糕。

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

reduceByKey(lambda x, y: max(x[1], y[1]))
Run Code Online (Sandbox Code Playgroud)

但这会引发以下错误:

TypeError: 'int' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

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

Ram*_*jan 5

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

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

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

在第二次迭代中,即前一个循环的最大值x445y[15,309]

x现在,当尝试通过 获取 的第二个元素x[1]445只是 an 时integer会发生错误

类型错误:“int”对象不可下标

我希望错误的含义是清楚的。您可以在我的另一个答案中找到更多详细信息

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

reduceByKey(lambda x, y: (x[0], max(x[1], y[1])))
Run Code Online (Sandbox Code Playgroud)