如何在 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+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告