在 PySpark 中,对于 group by 语句,agg 中使用 count 某一列和 count(*) 在一般情况下是不一样的。

让我们通过一个具体的例子来说明差异:

假设我们有以下 DataFrame df

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("*") 时,它会计算每个组中的所有行数,不管列值是否为空:
result = df.groupBy("id").agg(count("*").alias("count_star"))
result.show()

输出:

+---+----------+
| id|count_star|
+---+----------+
|  1|         2|
|  3|         1|
|  2|         2|
+---+----------+
  • 当你使用 count("value") 时,它只计算 value 列非空值的数量:
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 byagg 使用 count 某一列只会统计该列的非空值,而 count(*) 会统计所有行数。两者结果可能不同,具体取决于数据列中是否包含 null

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐