执行以下脚本时出现错误 “ 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
这是另一种方法:
您可以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)]
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,如下所示: 在控制器中,我正在对其进行布线并尝试使用: 当我尝试运行时,出现以下错误: