pyspark RDD countByKey() 如何计算?

Posted

技术标签:

【中文标题】pyspark RDD countByKey() 如何计算?【英文标题】:How does pyspark RDD countByKey() count? 【发布时间】:2019-02-03 18:30:36 【问题描述】:

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

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

输出:

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

我无法解释输出。为什么将 '1' 计为 3 而将 '11' 计为 1?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

这就像默认拆分以获得元组数组: (('1',11),('1'),('11'),('11',1)) 会变成 (('1',11),('1',''),('1','1'),('11',1)) countByKey 将导致: [('1','3'),('11','1')]

【讨论】:

以上是关于pyspark RDD countByKey() 如何计算?的主要内容,如果未能解决你的问题,请参考以下文章

大数据(8e)RDD常用算子

PySpark:如何从一个巨大的 RDD 中获取样本 RDD?

在pyspark中过滤两个RDD

PySpark 重新分区 RDD 元素

PySpark|RDD编程基础

使用 pyspark 交叉组合两个 RDD