Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyspark agg中计数函数的Pypark奇怪行为_Pyspark_Apache Spark Sql_Pyspark Dataframes - Fatal编程技术网

Pyspark agg中计数函数的Pypark奇怪行为

Pyspark agg中计数函数的Pypark奇怪行为,pyspark,apache-spark-sql,pyspark-dataframes,Pyspark,Apache Spark Sql,Pyspark Dataframes,我正在使用spark 2.4.0 在使用计数函数进行聚合时,我观察到一个奇怪的行为 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|

我正在使用spark 2.4.0 在使用计数函数进行聚合时,我观察到一个奇怪的行为

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|
+----+-----------+
在这里,您可以看到空值不被计数。我搜索了docus,但没有提到函数count不计算空值。 更让我惊讶的是

tst.groupby('col1').agg(F.count(F.col('col2').isNull())).show()
+----+---------------------+
|col1|count((col2 IS NULL))|
+----+---------------------+
|   1|                    2|
|   3|                    2|
|   2|                    2|
+----+---------------------+
在这里我完全糊涂了。当我使用isNull()时,它不应该只计算null值吗?为什么要计算所有的值


我遗漏了什么吗?

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

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

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

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

如果您将代码更改为

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

+----+--------+
|col1 |计数(1)|
+----+--------+
|   1|       2|
|   3|       2|
|   2|       2|
+----+--------+


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

非常感谢。这解释了很多。第二部分,我必须用在一个过滤器,然后计数。