如何pyspark RDD countByKey()算什么?

问题描述 投票:1回答:1

张贴这个问题之前,我搜索的社区,并提到pyspark文档,但我仍然无法了解其计数。

sc.parallelize((('1',11),('1'),('11'),('11',1))).countByKey().items() 

输出:

dict_items([('1', 3), ('11', 1)])

我不能够解释的输出。为什么计数“1”和3“11”为1?

python apache-spark pyspark rdd
1个回答
3
投票

当你调用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)]

外卖的是,你必须包含逗号,如果要指定没有价值的关键。

© www.soinside.com 2019 - 2024. All rights reserved.