pyspark RDD countByKey() 如何计数?

Siv*_*aTP 2 python apache-spark rdd pyspark

在发布这个问题之前,我搜索了社区并参考了 pyspark 文档,但我仍然无法理解它是如何计算的。

sc.parallelize((('1',11),('1'),('11'),('11',1))).countByKey().items() 
Run Code Online (Sandbox Code Playgroud)

输出:

dict_items([('1', 3), ('11', 1)])
Run Code Online (Sandbox Code Playgroud)

我无法解释输出。为什么将“1”计数为 3,将“11”计数为 1?

pau*_*ult 7

当您调用 时countByKey(),键将是传入的容器的第一个元素(通常是 a tuple),而值将是其余元素。

您可以认为执行在功能上大致等同于:

from operator import add

def myCountByKey(rdd):
    return rdd.map(lambda row: (row[0], 1)).reduceByKey(add)
Run Code Online (Sandbox Code Playgroud)

该函数将您的每一行映射rdd到该行的第一个元素(键)和数字1作为值。最后,我们减少将每个键的值加在一起,以获得计数。

让我们在你的例子上试试这个:

rdd = sc.parallelize((('1',11),('1'),('11'),('11',1)))
myCountByKey(rdd).collect()
#[('1', 3), ('11', 1)]
Run Code Online (Sandbox Code Playgroud)

“额外”'1'来自第三个元素('11')。将此行映射到(row[0], 1)yield ('1', 1)。在这种情况下,row[0]是字符串中的第一个字符。

您可能期望这表现得好像第三个元素是 tuple ('11',)

rdd = sc.parallelize((('1',11),('1',),('11',),('11',1)))
rdd.countByKey().items()
#[('1', 2), ('11', 2)]
Run Code Online (Sandbox Code Playgroud)

要点是,如果要指定没有值的键,则必须包含逗号。