PySpark 中聚合数据的 3 种方法

2025 年 1 月 7 日 | 阅读 3 分钟

PySpark 简介

PySpark 是 Apache Spark 的 Python API。Apache Spark 是一个开源的分布式计算框架,专为大数据处理和分析而设计。通过将 Spark 核心引擎与 Python 语言集成,PySpark 允许 Python 开发者利用 Spark 的并行处理能力。这包括数据操作、机器学习和流处理等任务。

PySpark 的关键组件

  • SparkSession:任何 Spark 功能的入口点,提供了一个统一的接口来处理分布式数据。
  • DataFrame:一个分布式数据集,组织成命名列,类似于数据库表,支持过滤、聚合和连接数据等高级操作。
  • RDD(弹性分布式数据集):Spark 的低级数据结构,提供容错的分布式内存抽象,用于处理大型数据集。
  • 转换(Transformations)和动作(Actions):转换(例如 `map`、`filter`)是对 RDD 的操作,会返回一个新的 RDD。相反,动作(例如 `count`、`collect`)在对数据集执行计算后,将一个值返回给驱动程序。
  • MLlib:Spark 的可扩展机器学习库,包含分类、回归、聚类、协同过滤等算法和实用工具。
  • Spark SQL:用于使用 SQL 查询处理结构化数据的模块。

PySpark 数据聚合的不同方法

在本节中,我们将讨论一些在 PySpark 中聚合数据的方法。

方法 1:使用 `groupBy` 和 `agg`

`groupBy` 和 `agg` 方法通常用于对分组数据执行多个操作。`groupBy` 按所需列对 DataFrame 进行分组,而 `agg` 对每个组执行聚合操作。

代码

输出

 
+----------------+-----------------------------+----------------+--------------+
|Department|             Average Salary|Total Salary|Max Salary|
+----------------+-----------------------------+----------------+--------------+
|             Sales|1833.3333333333333|             5500|          3000|
|   Marketing|                           1900.0|              3800|         2000|
+----------------+-----------------------------+-----------------+-------------+   

说明

  • 数据按“部门”列分组。
  • `agg` 函数计算每个部门的平均工资、总工资和最高工资。

方法 2:使用 `groupBy` 和聚合函数

可以对分组 DataFrame 直接实现 `count`、`mean`、`sum` 等聚合函数。直接在分组 DataFrame 上应用聚合函数可以简化常见聚合的语法。

代码

输出

 
+----------------+-------+
|Department|count|
+----------------+-------+
|             Sales|       3|
|    Marketing|       2|
+-----------------+------+   

说明

  • 数据按“部门”列分组。
  • `count` 函数计算每个部门的行数(员工数)。

方法 3:使用 `pivot`

`pivot` 方法在重塑数据方面非常有用,尤其是在创建数据透视表时。`pivot` 允许您将数据从行转换为列,并在过程中聚合数据。

代码

输出

 
+----------+-------------+-------+
|   Name|Marketing|Sales|
+----------+--------------+------+
| Charlie|          NULL|3000|
|      Bob|           1800|1500|
|    Alice|           2000|1000|
+---------+---------------+------+   

说明

  • 数据按“姓名”列分组。
  • `pivot` 方法为“部门”列中的每个唯一值创建列。
  • `sum` 函数聚合每个姓名和部门的工资。