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

相关推荐
唯余木叶下弦声18 天前
Spark区分应用程序 Application、作业Job、阶段Stage、任务Task
大数据·spark·pyspark
唯余木叶下弦声1 个月前
PySpark3:pyspark.sql.functions常见的60个函数
python·spark·pyspark
氵文大师1 个月前
[pyspark] pyspark中如何修改列名字
pyspark
出发行进1 个月前
Spark的yarn集群环境搭建
大数据·linux·分布式·spark·pyspark
天冬忘忧2 个月前
PySpark 本地开发环境搭建与实践
spark·conda·pyspark
songqq272 个月前
【快速上手】pyspark 集群环境下的搭建(Yarn模式)
大数据·spark·pyspark
尘世壹俗人2 个月前
PySpark任务提交
大数据·pyspark
出发行进2 个月前
Spark学习
大数据·linux·python·数据分析·spark·centos·pyspark
百流2 个月前
Pyspark中pyspark.sql.functions常用方法(3)(array操作)
linux·python·spark·pyspark·1024程序员节
百流2 个月前
Pyspark中pyspark.sql.functions常用方法(2)(时间函数)
数据库·python·spark·pyspark·dataframe