我正在尝试学习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],但是这个错误没有任何意义。我做错了什么?
答案 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} }}
在第二次迭代中445
为x
,即上一循环的最大值且445
为y
现在,当[15,309]
试图获取x
的第二个元素时,x[1]
只是445
,会发生错误
TypeError:' int'对象不可订阅
我希望错误的含义是清楚的。您可以在我的other answer
中找到更多详细信息上述解释也解释了为什么@pault在评论部分提出的解决方案有效,即
integer