python - pyspark RDD countByKey() 是如何计数的?

标签 python apache-spark pyspark rdd

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

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

输出:

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

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

最佳答案

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

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

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)]

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

关于python - pyspark RDD countByKey() 是如何计数的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54506132/

相关文章:

php - 在 PHP 中加密,在 Python 中解密

python - 我的井字游戏告诉我平局时我赢了

hadoop - 加入 RDD 中的特定行

python - 单独文件中的功能较慢

java - 应该包含/导入什么来识别我的 Spark -java 代码中的 "$"操作 join 函数?

apache-spark - Spark SQL 中具有等效精度的十进制类型

apache-spark - 如何将字节从 Kafka 转换为原始对象?

python - 如何在 pyspark 的 spark 中使用 "for"循环

pyspark - 如何在 Pyspark 中将列表拆分为多列?

python - 为 Pandas DataFrame 的每一行查找跨多列的模式