Pyspark agg中计数函数的Pypark奇怪行为
我正在使用spark 2.4.0 在使用计数函数进行聚合时,我观察到一个奇怪的行为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|
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
非常感谢。这解释了很多。第二部分,我必须用在一个过滤器,然后计数。