如何在 PySpark DataFrame 中更改列类型


Python 是一种用途广泛且功能强大的编程语言,在数据分析和处理领域获得了极高的普及率。凭借其广泛的库和框架,Python 为开发者提供了强大的工具,可以高效地处理复杂的数据操作。PySpark 是 Apache Spark 的 Python API,它通过提供用于大数据处理的分布式计算功能,将 Python 的功能提升到了一个新的水平。PySpark 的一个基本组成部分是 DataFrame,这是一种表格数据结构,允许无缝地操作和分析大型数据集。

在本教程中,我们将探讨使用 PySpark DataFrame 的一个重要方面:更改列类型。在进行数据转换、验证和分析时,了解和修改列类型至关重要。通过更改特定列的数据类型,我们可以确保数据一致性,准确地执行计算并优化内存使用。在文章的下一部分,我们将深入研究 PySpark 中可用于更改列类型的各种方法,并讨论它们的优缺点。

方法 1:使用 cast() 函数在 PySpark DataFrame 中更改列类型

在本节中,我们将探讨在 PySpark DataFrame 中更改列类型的第一种方法:使用 cast() 函数。cast() 函数允许我们将一列从一种数据类型转换为另一种数据类型,从而促进数据转换和操作。

PySpark DataFrame 中的 cast() 函数用于显式更改列的数据类型。它以所需的数据类型作为参数,并返回一个具有修改后列类型的新 DataFrame。当我们想要将列转换为特定类型以执行操作或当列类型需要与下游处理要求对齐时,cast() 函数特别有用。

以下是使用 cast() 函数的语法

df.withColumn("new_column_name", df["column_name"].cast("desired_data_type"))

让我们考虑一个示例,其中我们有一个 DataFrame,其中包含名为“age”的字符串类型列,并且我们想使用 cast() 函数将其转换为整数类型。

示例

# Creating a data frame with a string column
data = [("Prine", "25"), ("Mukul", "30"), ("Rohit", "35")]
df = spark.createDataFrame(data, ["name", "age"])
df.show()

# Converting the "age" column from string to integer
df = df.withColumn("age", df["age"].cast("integer"))
df.printSchema()

输出

+-----+---+
| name|age|
+-----+---+
| Prince| 25|
| Mukul| 30|
|  Rohit| 35|
+-----+---+

root
 |-- name: string (nullable = true)
 |-- age: integer (nullable = true)

在上面的示例中,我们使用 cast() 函数将“age”列的数据类型从字符串更改为整数。生成的 DataFrame 具有修改后的列类型,如打印的模式所示。

方法 2:使用 withColumn() 函数在 PySpark DataFrame 中更改列类型

在本节中,我们将探讨在 PySpark DataFrame 中更改列类型的另一种方法:使用 withColumn() 函数。withColumn() 函数允许我们创建一个具有所需数据类型的新列,同时保留 DataFrame 中的现有列。

withColumn() 函数接受两个参数:列名和定义列值的表达式。通过在表达式中指定所需的数据类型,我们可以有效地更改列类型。

以下是使用 withColumn() 函数更改列类型的语法

df.withColumn("new_column_name", expression)

让我们考虑一个示例,其中我们有一个 DataFrame,其中包含名为“price”的字符串类型列,并且我们想使用 withColumn() 函数将其转换为浮点类型。

示例

# Creating a data frame with a string column
data = [("Apple", "2.99"), ("Orange", "1.99"), ("Banana", "0.99")]
df = spark.createDataFrame(data, ["product", "price"])
df.show()

# Converting the "price" column from string to float
df = df.withColumn("price", df["price"].cast("float"))
df.printSchema()

输出

+-------+-----+
|product|price|
+-------+-----+
|  Apple| 2.99|
| Orange| 1.99|
| Banana| 0.99|
+-------+-----+

root
 |-- product: string (nullable = true)
 |-- price: float (nullable = true)

在上面的示例中,我们使用 withColumn() 函数创建了一个名为“price”的新列,并具有修改后的数据类型。生成的 DataFrame 具有更新后的列类型,如打印的模式所示。

方法 3:使用 SQL 表达式在 PySpark DataFrame 中更改列类型

在本节中,我们将探讨在 PySpark DataFrame 中更改列类型的最后一种也是最强大的方法:使用 SQL 表达式。PySpark 中的 SQL 表达式允许我们利用 SQL 查询的表达能力来执行各种操作,包括类型转换。

PySpark 中的 SQL 表达式提供了一种方便且熟悉的方式来操作 DataFrame 中的数据。这些表达式类似于标准 SQL 语法,使我们能够对数据执行复杂的计算、聚合和转换。

要使用 SQL 表达式更改列类型,我们可以使用 `select()` 函数以及 `expr()` 函数来定义所需的数据类型。`expr()` 函数允许我们在 PySpark 中编写类似 SQL 的表达式,从而可以直接操作列值并更改其类型。

以下是一个演示如何使用 SQL 表达式更改列类型的示例

示例

from pyspark.sql.functions import expr

# Creating a data frame with a string column
data = [("Prince", "25"), ("Mukul", "30"), ("Rohit", "35")]
df = spark.createDataFrame(data, ["name", "age"])
df.show()

# Converting the "age" column from string to integer using SQL expressions
df = df.select("name", expr("CAST(age AS INT) AS age"))
df.printSchema()

输出

+-----+---+
| name|age|
+-----+---+
| Prince| 25|
| Mukul| 30|
|  Rohit| 35|
+-----+---+

root
 |-- name: string (nullable = true)
 |-- age: integer (nullable = true)

在上面的示例中,我们使用 `select()` 函数以及 `expr()` 函数来更改列类型。我们在 `expr()` 函数中应用了 SQL 表达式 `CAST(age AS INT)` 将“age”列从字符串转换为整数。生成的 DataFrame 具有修改后的列类型,如打印的模式所示。

当您需要执行高级数据操作或在一个语句中组合多个操作时,SQL 表达式特别有用。它们允许对列转换进行细粒度控制,并且对于大规模数据处理非常高效。

结论

在本教程中,我们探讨了 PySpark 中可用于更改 DataFrame 中列类型的各种方法。我们为每种方法提供了示例,以便您更容易理解并在自己的项目中应用它们。首先,我们讨论了 `cast()` 函数,它允许我们将一列显式地从一种数据类型转换为另一种数据类型。接下来,我们探讨了 `withColumn()` 函数,它使我们能够创建一个具有所需数据类型的新列,同时保留 DataFrame 中的现有列。最后,我们介绍了 PySpark 中的 SQL 表达式,它提供了一种强大的方法来操作 DataFrame 中的数据。我们展示了如何利用 `select()` 函数以及 `expr()` 函数来利用 SQL 表达式更改列类型。通过了解和使用这些方法,您可以确保 PySpark 项目中的数据一致性,执行准确的计算并优化内存使用。

更新于:2023年7月20日

7000+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.