Apache spark pyspark计数列中的非空值

Apache spark pyspark计数列中的非空值,apache-spark,null,pyspark,Apache Spark,Null,Pyspark,我有一个包含空值的数据帧: 数据=[ (125,'2012-10-10','tv'), (20,'2012-10-10','phone'), (40,'2012-10-10','tv'), (无,'2012-10-10','tv')] df=spark.createDataFrame(数据,[“销售”、“日期”、“产品”]) 我需要计算sales列中的非空值。 我尝试了3种方法: 第一个我做对了: df.where(F.col(“销售”).isNotNull()).groupBy(“产品”)\

我有一个包含空值的数据帧:

数据=[
(125,'2012-10-10','tv'),
(20,'2012-10-10','phone'),
(40,'2012-10-10','tv'),
(无,'2012-10-10','tv')]
df=spark.createDataFrame(数据,[“销售”、“日期”、“产品”])
我需要计算sales列中的非空值。 我尝试了3种方法: 第一个我做对了:

df.where(F.col(“销售”).isNotNull()).groupBy(“产品”)\
.agg((F.count(F.col(“Sales”))。别名(“Sales_count”)))。show()
我会得到

产品|销售|计数
电话| 1
电视| 2
第二个,不正确:

df.groupBy('product'))\
.agg((F.count(F.col(“Sales”).isNotNull()).alias(“Sales_count”)).show()
产品|销售额|计数
电话| 1
电视| 3
第三个错误是:

df.groupBy('product')\.agg((F.col(“Sales”).isNotNull().count()).alias(“Sales\u count”)).show()
TypeError:“列”对象不可调用
第二种和第三种方法中可能导致错误的原因是什么?
谢谢。

有一个更简单的方法:

>>> df.groupBy("product").agg({"Sales":"count"}).show()
+-------+------------+
|product|count(Sales)|
+-------+------------+
|  phone|           1|
|     tv|           2|
+-------+------------+

您的第一次尝试是在进行聚合之前过滤掉
Sales
列中的
null
行。因此,它给了你正确的结果

但是第二个代码

df.groupBy('product') \
    .agg((F.count(F.col("Sales").isNotNull()).alias("sales_count"))).show()
您没有对整个数据集进行
筛选
并进行
聚合
。如果仔细分析
F.col(“Sales”).isNotNull()
将给出布尔列,即
true
false
So
F.count(F.col(“Sales”).isNotNull())
只是计算分组数据集中的布尔值,如果您创建如下新列,这一点很明显

df.withColumn("isNotNull", F.col("Sales").isNotNull()).show()
那会给你什么

+-----+----------+-------+---------+
|Sales|      date|product|isNotNull|
+-----+----------+-------+---------+
|  125|2012-10-10|     tv|     true|
|   20|2012-10-10|  phone|     true|
|   40|2012-10-10|     tv|     true|
| null|2012-10-10|     tv|    false|
+-----+----------+-------+---------+
因此,您第二次尝试时的计数是正确的

对于第三次尝试,
.count()
是一个不能在聚合转换中使用的操作只有返回列数据类型的函数才能在
.agg()
中使用,它们可以是内置函数、udf函数或您自己的函数。