pyspark groupby

在 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值