如何理解Spark中的reduceByKey?

时间:2018-03-15 15:49:22

标签: python apache-spark functional-programming pyspark documentation

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

我一直在努力寻找这些函数的详细文档,这些文档可以解释实际上的参数是什么,这样我就可以自己解决它而不需要Stack Overflow,但我找不到Spark的任何好文档。我已经阅读过Learning Spark的第3章和第4章,但说实话,对最复杂函数的解释非常糟糕。

我正在处理的问题如下:我有一对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],但是这个错误没有任何意义。我做错了什么?

1 个答案:

答案 0 :(得分:2)

让我们说你有[("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),即{{1} }}

在第二次迭代中445x,即上一循环的最大值445y

现在,当[15,309]试图获取x的第二个元素时,x[1]只是445会发生错误

  
    

TypeError:' int'对象不可订阅

  

我希望错误的含义是清楚的。您可以在我的other answer

中找到更多详细信息

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

integer