当前位置: 首页 > 面试题库 >

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

王涵育
2023-03-14
问题内容

执行以下脚本时出现错误 “ int对象 不可 订阅”

element.reduceByKey( lambda x , y : x[1]+y[1])

with element是键值RDD,值是元组。输入示例:

(A, (toto , 10))
(A, (titi , 30))
(5, (tata, 10))
(A, (toto, 10))

我知道该reduceByKey函数采用(K,V)元组,并将函数应用于所有值以获取reduce的最终结果。就像ReduceByKey
Apache中
给出的示例一样。

有什么帮助吗?


问题答案:

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

让我们考虑一下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 + v

print(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

这是另一种方法:

您可以tuplereduce函数中创建,然后调用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()将为您提供正确的输出。


 类似资料:
  • 我的“asdasd.csv”文件具有以下结构。 好的,我得到下面的{key,value}元组来操作它。 我的计算平均值的代码如下,我必须计算每一列的平均值,X,Y,Z为每一个键。 /opt/spark/current/python/pyspark/rdd.py in take(self,num)1341 1342 p=range(partsScanned,min(partsScanned+numP

  • 问题内容: 我正在尝试运行一个for循环。这是我遇到问题的代码部分: 因此,我的目的是遍历aldurstengd_ororka,对于字典中的每个“年龄”元组,我为元组中的每个“项目”运行另一个for循环。我得到的错误是 TypeError:“ int”对象不可迭代 问题答案: 如果是字典,则此表达式: 是一个错误。也许您的意思是: 编辑:您看到的错误是非常有趣的,我确实使用此代码段重现了它: 代码

  • 问题内容: 给定以下整数和计算 结果是: 如何将输出舍入为整数? 问题答案: 给定以下整数和计算 结果是: 如何将输出舍入为整数?

  • 我正在学习Django和Rest框架,我有一个小项目要练习,但我在试图访问http://localhost:8000/admin:typeerror时出错:对象'module'不可订阅。 以下是我创建的Python文件: 文件“/home/jesus/.local/lib/python3.8/site-packages/django/core/handlers/base.py”,第115行,在_g

  • 问题内容: 我得到了这个,我期望它在打印x.withdraw()时能打印410。 这是我的代码: 我是否需要在类本身中修复某些问题,或者我的方法调用有问题? 问题答案: 您在实例上设置具有相同名称的属性: 您正在尝试调用的是该属性,而不是方法。Python不会区分方法和属性,它们也不位于单独的命名空间中。 为属性使用其他名称;(退出的过去时)作为更好的属性名称浮现在脑海: (我也纠正了一个错字;您

  • 当我试图在python中打开一个文件时,我得到了错误,typeerror'_csv.reader'对象是不可订阅的。代码如下,有人能帮我吗 在以下代码中,读卡器[:1]中的行出现错误: 我需要跳过第一行,因为它有标题,这就是为什么我做读者[: 1]

  • 问题内容: …引发错误: 我想通过将每个数字相加来找出总数,例如110。1 + 1 + 0 =2。我该怎么做? 谢谢 问题答案: 首先,不要再调用-您正在将字符串转换为整数,这不是您想要的(您希望将每个字符视为自己的数字)。更改: 至: 现在这是一个数字字符串,您可以逐个数字地对其进行循环。 接下来,将一些初始值分配给-就像您现在的代码一样,由于您从未初始化它,因此将获得一个。大概您想在循环之前。

  • 为了将会话保存在数据库中,我在这里使用这个示例实现了Spring会话JDBC。我在使用@Autow的会话范围时遇到问题:我JavaClass如下: 然后我在会话\u范围内注册这个bean,如下所示: 在控制器中,我正在对其进行布线并尝试使用: 当我尝试运行时,出现以下错误: