我想知道为什么我在使用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
功能。
1条答案
按热度按时间jyztefdp1#
代码中的问题是传递给的reduce函数
reduceByKey
不会产生与rdd值相同的数据类型。lambda函数返回int
而你的值是string
.要理解这一点,只需考虑reduce是如何工作的。将函数应用于前两个值,然后将函数的结果添加到第三个值,依此类推。。。
请注意,即使是一个为你工作实际上是不正确的。例如,它返回
('Danner, Blythe', 'Pear')
而不是('Danner, Blythe', 4)
.应首先将值转换为相应的长度,然后按键减少: