如何理解 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
在第二次迭代中 x
是 445
,即前一个循环的 max 和 y
是 [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])))
我正在尝试学习 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
在第二次迭代中 x
是 445
,即前一个循环的 max 和 y
是 [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])))