在 PySpark 中,对于 group by
语句,agg
中使用 count
某一列和 count(*)
在一般情况下是不一样的。
让我们通过一个具体的例子来说明差异:
假设我们有以下 DataFrame df
:
python
from pyspark.sql import SparkSession
from pyspark.sql.functions import count
spark = SparkSession.builder.appName("example").getOrCreate()
data = [
(1, "a"),
(1, "b"),
(2, "c"),
(2, None),
(3, None)
]
df = spark.createDataFrame(data, ["id", "value"])
- 当你使用
count("*")
时,它会计算每个组中的所有行数,不管列值是否为空:
python
result = df.groupBy("id").agg(count("*").alias("count_star"))
result.show()
输出:
+---+----------+
| id|count_star|
+---+----------+
| 1| 2|
| 3| 1|
| 2| 2|
+---+----------+
- 当你使用
count("value")
时,它只计算value
列非空值的数量:
python
result = df.groupBy("id").agg(count("value").alias("count_value"))
result.show()
输出:
+---+-----------+
| id|count_value|
+---+-----------+
| 1| 2|
| 3| 0|
| 2| 1|
+---+-----------+
可以看到区别:
count("*")
会统计所有行数,忽略列中的null
值。count("value")
只会统计非null
的列值。因此,如果某列包含null
值,count("column_name")
的结果可能会比count("*")
更少。
总结:group by
中 agg
使用 count
某一列只会统计该列的非空值,而 count(*)
会统计所有行数。两者结果可能不同,具体取决于数据列中是否包含 null
。