PySpark中对<string, int>型元组RDD求和时出现下标不可用错误求助
问题分析
你的错误源于对reduce算子执行逻辑的误解:reduce会迭代合并RDD中的元素,第一次运算时a和b都是<string, int>元组,返回的是两者int值的和(整数类型);第二次迭代时,a变成了这个整数,而b仍然是元组,此时访问a[1]自然会报错(整数没有下标)。
解决方案
推荐两种简洁可靠的方式实现所有元素的求和:
方法1:提取值后直接求和(最推荐)
先通过values()方法提取RDD中所有的int值,再调用Spark内置的sum()方法直接求和,代码简洁且高效:
sum_elements = films.values().sum()
或者用reduce手动合并(效果和sum()一致):
sum_elements = films.values().reduce(lambda x, y: x + y)
方法2:兼容reduce的迭代逻辑(不推荐,仅作原理演示)
如果一定要直接在原元组RDD上使用reduce,需要判断a的类型,处理第一次迭代(元组+元组)和后续迭代(整数+元组)的情况:
sum_elements = films.reduce(lambda a, b: a[1] + b[1] if isinstance(a, tuple) else a + b[1])
内容的提问来源于stack exchange,提问作者Francisco Chacón Rubio
相关产品推荐
相关产品推荐

