【问题标题】:pyspark-strange behavior of count function inside aggagg 中计数函数的 pyspark 奇怪行为
【发布时间】:2020-06-25 21:20:25
【问题描述】:

我正在使用火花 2.4.0 我在使用 count 函数进行聚合时观察到一种奇怪的行为。

from pyspark.sql import functions as F
tst=sqlContext.createDataFrame([(1,2),(1,5),(2,None),(2,3),(3,None),(3,None)],schema=['col1','col2'])
tst.show()
+----+----+
|col1|col2|
+----+----+
|   1|   2|
|   1|   5|
|   2|null|
|   2|   3|
|   3|null|
|   3|null|
+----+----+

tst.groupby('col1').agg(F.count('col2')).show()
+----+-----------+
|col1|count(col2)|
+----+-----------+
|   1|          2|
|   3|          0|
|   2|          1|
+----+-----------+

这里你可以看到空值没有被计算在内。我搜索了文档,但没有提到函数计数不计算空值。 更令我惊讶的是这个

tst.groupby('col1').agg(F.count(F.col('col2').isNull())).show()
+----+---------------------+
|col1|count((col2 IS NULL))|
+----+---------------------+
|   1|                    2|
|   3|                    2|
|   2|                    2|
+----+---------------------+

在这里我完全糊涂了。当我使用 isNull() 时,它不应该只计算空值吗?为什么要计算所有值?

有什么我遗漏的吗?

【问题讨论】:

    标签: pyspark apache-spark-sql pyspark-dataframes


    【解决方案1】:

    在这两种情况下,您看到的结果都是预期的。

    关于第一个示例:检查 Scala source of count count(*) 和 count('col2') 之间存在细微差别:

    FUNC(*) - 返回检索到的总行数,包括包含 null 的行。
    FUNC(expr[, expr...]) -返回提供的表达式全部为非空的行数。

    这解释了为什么不计算 null 条目。

    如果你把代码改成

    tst.groupby('col1').agg(F.count('*')).show()
    

    你得到

    +----+--------+
    |col1|count(1)|
    +----+--------+
    |   1|       2|
    |   3|       2|
    |   2|       2|
    +----+--------+
    

    关于第二部分:表达式F.col('col2').isNull() 返回一个布尔值。无论此布尔值的实际值是多少,都会计算行,因此您会看到 2。

    【讨论】:

    • 非常感谢。这解释了很多。第二部分,我一定是在过滤器中使用过,然后计数。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多