如何在 PySpark Dataframe 中更改列类型

pythonserver side programmingprogramming

Python 是一种多功能且功能强大的编程语言,在数据分析和处理领域广受欢迎。凭借其广泛的库和框架,Python 为开发人员提供了强大的工具来高效处理复杂的数据操作。PySpark 是 Apache Spark 的 Python API,它通过提供用于大数据处理的分布式计算功能,将 Python 的功能提升到了一个新的水平。PySpark 的基本组件之一是 DataFrame,这是一种表格数据结构,允许无缝操作和分析大型数据集。

在本教程中,我们将探讨使用 PySpark DataFrames 的一个重要方面:更改列类型。在数据转换、验证和分析方面,理解和修改列类型至关重要。通过改变特定列的数据类型,我们可以确保数据一致性、准确执行计算并优化内存使用率。在本文的下一部分中,我们将深入研究 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() 函数将其转换为整数类型。

示例

# 创建带有字符串列的数据框
data = [("Prine", "25"), ("Mukul", "30"), ("Rohit", "35")]
df = spark.createDataFrame(data, ["name", "age"])
df.show()

# 将"age"列从字符串转换为整数
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() 函数将其转换为浮点类型。

示例

# 创建带有字符串列的数据框
data = [("Apple", "2.99"), ("Orange", "1.99"), ("Banana", "0.99")]
df = spark.createDataFrame(data, ["product", "price"])
df.show()

# 将"price"列从字符串转换为浮点数
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

# 创建带有字符串列的数据框
data = [("Prince", "25"), ("Mukul", "30"), ("Rohit", "35")]
df = spark.createDataFrame(data, ["name", "age"])
df.show()

# 使用 SQL 表达式将"age"列从字符串转换为整数
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 中可用于更改数据框中列类型的各种方法。我们为每种方法提供了示例,以便您更轻松地理解并在自己的项目中应用它们。首先,我们讨论了 `cast()` 函数,它允许我们将列从一种数据类型显式转换为另一种数据类型。接下来,我们探索了 `withColumn()` 函数,该函数使我们能够创建具有所需数据类型的新列,同时保留 DataFrame 中的现有列。最后,我们在 PySpark 中引入了 SQL 表达式,它提供了一种在 DataFrame 中操作数据的强大方法。我们展示了如何利用 SQL 表达式通过使用 `select()` 函数和 `expr()` 函数来更改列类型。通过理解和利用这些方法,您可以确保数据一致性、执行准确计算并优化 PySpark 项目中的内存使用情况。


相关文章