spark数据帧分组不计算空值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark数据帧分组不计算空值相关的知识,希望对你有一定的参考价值。

我有一个spark DataFrame,它按聚合计数的列分组:

df.groupBy('a').agg(count("a")).show

+---------+----------------+
|a        |count(a)        |
+---------+----------------+
|     null|               0|
|      -90|           45684|
+---------+----------------+


df.select('a').filter('aisNull').count

回报

warning: there was one feature warning; re-run with -feature for details
res9: Long = 26834

这清楚地表明最初没有计算空值。

这种行为的原因是什么?我希望(如果nullat全部包含在分组结果中)以正确查看计数。

答案

是的,应用于特定列的count不计算空值。如果要包含空值,请使用:

df.groupBy('a).agg(count("*")).show
另一答案

这种行为的原因是什么?

SQL-92标准。 In particular(强调我的):

设T是<set function specification>的参数或参数源。

如果指定COUNT(*),则结果是T的基数。

否则,让TX成为单列表,它是将<value expression>应用于T的每一行并消除空值的结果。

如果指定了DISTINCT,则让TXA成为从TX中消除冗余重复值的结果。否则,让TXA成为TX。

如果指定了COUNT,则结果是TXA的基数。

以上是关于spark数据帧分组不计算空值的主要内容,如果未能解决你的问题,请参考以下文章

Scala中的Spark分组映射UDF

控制 spark-sql 和数据帧中的字段可空性

Spark fillNa 不替换空值

为什么过滤器在spark数据帧上默认删除空值?

在 Spark 2.4 中使用正则表达式替换向数据帧输出添加空值

spark 例子wordcount topk