pyspark groupby

在 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 byagg 使用 count 某一列只会统计该列的非空值,而 count(*) 会统计所有行数。两者结果可能不同,具体取决于数据列中是否包含 null

相关推荐
不辉放弃12 天前
Apache Flink 的详细介绍
数据库·flink·pyspark·大数据开发
不辉放弃13 天前
pyspark中的kafka的读和写案例操作
大数据·数据库·pyspark·大数据开发
不辉放弃13 天前
Spark SQL 的 SQL 模式和 DSL模式
数据库·pyspark·大数据开发
不辉放弃14 天前
Apache Spark 的结构化流
大数据·数据库·pyspark·伪实时
@十八子德月生14 天前
第三阶段—8天Python从入门到精通【itheima】-143节(pyspark实战——数据计算——flatmap方法)
大数据·开发语言·python·数据分析·pyspark·好好学习,天天向上·question answer
不辉放弃17 天前
Spark SQL 的详细介绍
数据库·pyspark·大数据开发·sparksql
不辉放弃19 天前
Spark的宽窄依赖
大数据·数据库·pyspark
不辉放弃20 天前
kafka的消息存储机制和查询机制
数据库·kafka·pyspark·大数据开发
不辉放弃25 天前
kafka的shell操作
数据库·kafka·pyspark·大数据开发
不辉放弃1 个月前
spark on yarn
pyspark·大数据开发