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() 如何计算?的主要内容,如果未能解决你的问题,请参考以下文章