栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用reducebykey时出错:int对象不可订阅

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用reducebykey时出错:int对象不可订阅

这是一个例子,将说明正在发生的事情。

让我们考虑一下

reduce
使用某些函数调用列表时会发生什么
f

reduce(f, [a,b,c]) = f(f(a,b),c)

如果以您的示例为例,

f = lambda u, v: u[1] + v[1]
则以上表达式可分解为:

reduce(f, [a,b,c]) = f(f(a,b),c) = f(a[1]+b[1],c)

但是

a[1] + b[1]
是整数
__getitem__
,因此没有方法,因此会出错。

通常,更好的方法(如下所示)是

map()
先提取所需格式的数据,然后应用
reduceByKey()


MCVE与您的数据

element = sc.parallelize(    [        ('A', ('toto' , 10)),        ('A', ('titi' , 30)),        ('5', ('tata', 10)),        ('A', ('toto', 10))    ])

您可以使用更复杂的reduce函数 几乎 获得所需的输出:

def add_tuple_values(a, b):    try:        u = a[1]    except:        u = a    try:        v = b[1]    except:        v = b    return u + vprint(element.reduceByKey(add_tuple_values).collect())

除了会导致:

[('A', 50), ('5', ('tata', 10))]

为什么? 因为密钥只有一个值

'5'
,所以没有什么可以减少的。

由于这些原因,最好先致电

map
。要获得所需的输出,可以执行以下操作:

>>> print(element.map(lambda x: (x[0], x[1][1])).reduceByKey(lambda u, v: u+v).collect())[('A', 50), ('5', 10)]

更新1

这是另一种方法:

您可以

tuple
reduce
函数中创建,然后调用
map
以提取所需的值。(基本上颠倒了
map
和的顺序
reduce
。)

print(    element.reduceByKey(lambda u, v: (0,u[1]+v[1]))        .map(lambda x: (x[0], x[1][1]))        .collect())[('A', 50), ('5', 10)]

笔记

  • 如果每个键至少有2条记录,使用
    add_tuple_values()
    将为您提供正确的输出。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646697.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号