当您调用countByKey() 时,键将是传入的容器的第一个元素(通常是tuple),其余的将是值。
您可以认为执行在功能上大致相当于:
from operator import add
def myCountByKey(rdd):
return rdd.map(lambda row: (row[0], 1)).reduceByKey(add)
该函数将rdd 中的每一行映射到行的第一个元素(键)和数字1 作为值。最后,我们减少将每个键的值相加,以获得计数。
让我们在你的例子上试试这个:
rdd = sc.parallelize((('1',11),('1'),('11'),('11',1)))
myCountByKey(rdd).collect()
#[('1', 3), ('11', 1)]
“额外”'1' 来自第三个元素 ('11')。将此行映射到(row[0], 1) 会产生('1', 1)。在这种情况下,row[0] 是字符串中的第一个字符。
您可能希望这表现得好像第三个元素是元组 ('11',)。
rdd = sc.parallelize((('1',11),('1',),('11',),('11',1)))
rdd.countByKey().items()
#[('1', 2), ('11', 2)]
如果要指定没有值的键,必须包含逗号。