【问题标题】:How does pyspark RDD countByKey() count?pyspark RDD countByKey() 如何计算?
【发布时间】: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?

【问题讨论】:

    标签: python apache-spark pyspark rdd


    【解决方案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')]

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        相关资源
        最近更新 更多