pyspark typeerror使用reducebykey函数对文本长度求和时出错

wyyhbhjk  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(538)

我想知道为什么我在使用reducebykey函数计算每个给定名称(键)的每个列表中的所有字符的总长度时会出现类型错误。

data = [("Cassavetes, Frank", 'Orange'),
("Cassavetes, Frank", 'Pineapple'),
("Knight, Shirley (I)", 'Apple'),
("Knight, Shirley (I)", 'Blueberries'),
("Knight, Shirley (I)", 'Orange'),
("Yip, Françoise", 'Grapes'),
("Yip, Françoise", 'Apple'),
("Yip, Françoise", 'Strawberries'),
("Danner, Blythe", 'Pear'),
("Buck (X)", 'Kiwi')]

为了做到这一点,我尝试执行下面的代码;

rdd = spark.sparkContext.parallelize(data)
reducedRdd = rdd.reduceByKey( lambda a,b: len(a) + len(b) )
reducedRdd.collect()

上面的代码产生以下错误:
typeerror:类型为“int”的对象没有len()
我期望的结果如下:;
是的,弗兰ç“瓦兹”,14),(“卡萨维茨,弗兰克”,15),(“奈特,雪莉(i)”,8),(“丹纳,布莱斯”,“梨”),(“巴克(x)”,“猕猴桃”)]
我注意到下面的代码产生了预期的结果;

reducedRdd = rdd.reduceByKey( lambda a,b: len(str(a)) + len(str(b)) )

虽然我不知道为什么我需要将变量a和b转换成字符串,如果它们最初是字符串,例如,我不知道“orange”in(“cassavetes,frank”,“orange”)如何被视为int。
ps我知道我可以使用许多其他函数来实现所需的结果,但我特别想知道为什么我在尝试使用 reduceByKey 功能。

jyztefdp

jyztefdp1#

代码中的问题是传递给的reduce函数 reduceByKey 不会产生与rdd值相同的数据类型。lambda函数返回 int 而你的值是 string .
要理解这一点,只需考虑reduce是如何工作的。将函数应用于前两个值,然后将函数的结果添加到第三个值,依此类推。。。
请注意,即使是一个为你工作实际上是不正确的。例如,它返回 ('Danner, Blythe', 'Pear') 而不是 ('Danner, Blythe', 4) .
应首先将值转换为相应的长度,然后按键减少:

reducedRdd = rdd.mapValues(lambda x: len(x)).reduceByKey(lambda a, b: a + b)
print(reducedRdd.collect())

# [('Cassavetes, Frank', 15), ('Danner, Blythe', 4), ('Buck (X)', 4), ('Knight, Shirley (I)', 22), ('Yip, Françoise', 23)]

相关问题