在 PySpark DataFrame 中将单列拆分为多列

17 Mar 2025 | 5 分钟阅读

在记录评估和操作职责中,处理以 DataFrame 等依赖格式存储的表格数据并不罕见。PySpark 是一个强大的分布式数据处理框架,提供了各种功能来高效地执行复杂的数据转换。一项常见的任务是将单列拆分为多列,这可以使用 PySpark 的内置函数来完成。

PySpark DataFrame 简介

PySpark DataFrame 是 PySpark 库中的一个基本抽象,专为分布式数据处理和操作而设计。它是 Apache Spark 生态系统的关键部分,并提供了一种强大而高效的方式来大规模处理结构化数据。PySpark DataFrame 构建在 Spark 的弹性分布式数据集(RDD)模型的能力之上,并将其扩展为提供一个更高级别的表格数据结构,类似于 SQL 表或 Pandas DataFrame。

PySpark DataFrame 的主要特性

  1. 优化: PySpark DataFrame 包含一个优化器,可以将操作推送到低级 RDD 并优化查询执行计划。这种优化通过减少数据混洗和最小化网络传输的数据量来提高整体性能。
  2. 分布式处理: PySpark DataFrame 利用 Apache Spark 的分布式计算能力。它将数据分布在一组机器上,并并行处理,从而能够高效地处理大型数据集。
  3. 互操作性: PySpark DataFrame 与其他 Spark 组件无缝集成,包括用于 SQL 查询和结构化数据处理的 Spark SQL、用于机器学习的 MLlib,以及用于实时数据处理的 Spark Streaming。
  4. 模式和元数据: PySpark DataFrame 具有模式,该模式定义了数据的结构,包括列名和数据类型。此模式信息用于各种优化和数据验证。
  5. 惰性求值: 与 Spark RDD 类似,PySpark DataFrame 使用惰性求值。DataFrame 上的转换不会立即执行,而是记录在逻辑执行计划中。这使得 Spark 可以在实际计算之前优化执行计划,从而提高整体性能。
  6. API 简洁性: PySpark DataFrame 提供了一个高级的、类似 SQL 的 API,允许用户使用熟悉的界面来表达复杂的数据转换。这种抽象使得 SQL 和面向编程的用户更容易处理数据。

拆分列:场景

考虑一种情况,您有一个 DataFrame,其中包含需要拆分为单独列的值。这在处理包含单个字段中存储的复合值的数据时很常见,例如全名或包含年、月、日组件的日期。

在本教程中,我们将引导您完成使用 PySpark 将单列拆分为多列的过程。

使用 PySpark 拆分列

要将单列拆分为多列,PySpark 提供了多种内置函数,其中 `split()` 是最常用的。`split()` 函数接受两个参数:要拆分的列和分隔值的分隔符。

以下是如何在 PySpark DataFrame 中将单列拆分为多列的逐步指南

导入所需的模块

创建 SparkSession

创建 DataFrame

假设您有一个名为 `df` 的 DataFrame,其中包含一个名为“Full Name”的列。我们将此列拆分为“First Name”和“Last Name”列。

使用 `split()` 函数

现在,让我们使用 `split()` 函数将“Full Name”列拆分为“First Name”和“Last Name”列。

显示结果

完整代码

输出

Split Single Column into Multiple Columns in PySpark DataFrame

另一个代码

输出

Split Single Column into Multiple Columns in PySpark DataFrame

与任何技术一样,PySpark DataFrame 提供了许多优点和一些缺点。了解这些优点和缺点可以帮助您就 PySpark DataFrame 是否适合您的数据处理和分析需求做出明智的决定。

PySpark DataFrame 的优点

  1. 分布式处理: PySpark DataFrame 构建在 Apache Spark 之上,支持跨集群的分布式处理。这在大规模数据处理任务中带来了显著的性能提升。
  2. 易于使用: DataFrame API 用户友好,并提供了一个熟悉的类似 SQL 的界面来进行数据操作。这使得 SQL 和面向编程的用户都可以访问。
  3. 并行处理: DataFrame 允许数据的并行处理,利用了集群的全部功能。这加快了数据分析并减少了处理时间。
  4. 惰性求值: 与其他 Spark 组件一样,PySpark DataFrame 操作是惰性求值的,这允许 Spark 在实际计算之前优化执行计划。这可以带来更高的性能和资源利用率。
  5. 优化: PySpark DataFrame 包含一个 Catalyst 优化器,可以优化查询执行计划。这种优化可以通过最小化数据混洗和减少不必要的计算来提高查询效率。
  6. 模式和类型安全: PySpark DataFrame 具有模式,可确保数据遵循定义的结构。这增加了一层数据验证和类型安全性。
  7. 集成: PySpark DataFrame 与 Spark SQL、MLlib 和 Spark Streaming 等其他 Spark 组件无缝集成,为各种数据处理任务提供了一个全面的平台。

PySpark DataFrame 的缺点

  1. 内存开销: DataFrame 由于额外的元数据和优化过程会产生一些内存开销。这可能会影响非常小数据集的内存利用率。
  2. 学习曲线: 虽然 DataFrame API 设计得用户友好,但仍然存在学习曲线,特别是对于不熟悉分布式计算概念的用户。
  3. 表达能力有限: 虽然 DataFrame API 很灵活,但它可能无法涵盖使用低级 RDD 转换可以执行的所有操作。在某些情况下,用户可能需要回退到 RDD 进行特定的自定义操作。
  4. 序列化开销: DataFrame 操作涉及数据的序列化和反序列化,这可能会增加开销,特别是对于细粒度操作。
  5. 调试挑战: 调试分布式系统可能比单机解决方案更具挑战性。识别在复杂转换和优化中出现的问题可能需要额外的专业知识。
  6. 设置复杂性: 设置 Spark 集群和配置资源可能比使用单机解决方案更复杂。处理大型集群时,这种复杂性会增加。