【问题标题】:How to understand reduceByKey in Spark?如何理解 Spark 中的 reduceByKey?
【发布时间】:2018-08-24 12:32:46
【问题描述】:

我正在尝试学习 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],但随后错误没有任何意义。我做错了什么?

【问题讨论】:

  • My answer 到另一个问题可能有助于向您解释发生了什么。在您的情况下,它可能就像这样做一样简单:reduceByKey(lambda x, y: (x[0], max(x[1], y[1])))
  • 谢谢,这解决了我的问题!我会阅读您链接的答案。

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


【解决方案1】:

假设你有[("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,即 前一个循环的最大值y[15,309]

现在当x[1]尝试获取x的第二个元素而445只是一个integer时,出现错误

TypeError: 'int' 对象不可下标

我希望错误的含义很清楚。您可以在我的other answer中找到更多详细信息

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

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

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 2016-02-25
    • 2019-03-05
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多