共用方式為


轉換複雜的資料類型

使用巢狀資料類型時,Azure Databricks 會將現成可用的特定轉換最佳化。 下列程式碼範例示範在 Azure Databricks 中使用複雜和巢狀資料類型的模式。

用於存取巢狀資料的點標記法

您可以使用點標記法 (.) 來存取巢狀欄位。

Python

df.select("column_name.nested_field")

SQL

SELECT column_name.nested_field FROM table_name

選取所有巢狀欄位

使用星號運算子 (*) 來選取指定欄位內的所有欄位。

注意

這只會在指定深度解壓縮巢狀欄位。

Python

df.select("column_name.*")

SQL

SELECT column_name.* FROM table_name

建立新的巢狀欄位

使用 struct() 函數來建立新的巢狀欄位。

Python

from pyspark.sql.functions import struct, col

df.select(struct(col("field_to_nest").alias("nested_field")).alias("column_name"))

SQL

SELECT struct(field_to_nest AS nested_field) AS column_name FROM table_name

將所有欄位巢狀至資料行

使用星號運算子 (*) 將資料來源中的所有欄位巢狀為單一資料行。

Python

from pyspark.sql.functions import struct

df.select(struct("*").alias("column_name"))

SQL

SELECT struct(*) AS column_name FROM table_name

從巢狀資料行選取具名欄位

使用方括弧 [] 從資料行選取巢狀欄位。

Python

from pyspark.sql.functions import col

df.select(col("column_name")["field_name"])

SQL

SELECT column_name["field_name"] FROM table_name

從地圖或陣列分解巢狀元素

使用 explode() 函數從 ARRAYMAP 類型資料行解壓縮值。

ARRAY 資料行會將值儲存為清單。 使用 explode() 解壓縮時,每個值都會變成輸出中的資料列。

Python

from pyspark.sql.functions import explode

df.select(explode("array_name").alias("column_name"))

SQL

SELECT explode(array_name) AS column_name FROM table_name

MAP 資料行會將值儲存為已排序的索引鍵/值組。 使用 explode() 解壓縮時,每個索引鍵都會變成資料行,而值會變成資料列。

Python

from pyspark.sql.functions import explode

df.select(explode("map_name").alias("column1_name", "column2_name"))

SQL

SELECT explode(map_name) AS (column1_name, column2_name) FROM table_name

從清單或集合建立陣列

使用函數 collect_list()collect_set() 將資料行的值轉換成陣列。 collect_list() 會收集資料行中的所有值,而 collect_set() 只會收集唯一值。

注意

Spark 不保證任一作業所產生之陣列中的項目順序。

Python

from pyspark.sql.functions import collect_list, collect_set

df.select(collect_list("column_name").alias("array_name"))
df.select(collect_set("column_name").alias("set_name"))

SQL

SELECT collect_list(column_name) AS array_name FROM table_name;
SELECT collect_set(column_name) AS set_name FROM table_name;

從陣列中的對應選取資料行

您也可以使用點標記法 (.) 來存取陣列中包含之對應中的欄位。 這樣會傳回指定欄位之所有值的陣列。

請考慮下列資料結構:

{
  "column_name": [
    {"field1": 1, "field2":"a"},
    {"field1": 2, "field2":"b"}
  ]
}

您可以使用下列查詢,以陣列的形式從 field1 傳回值:

Python

df.select("column_name.field1")

SQL

SELECT column_name.field1 FROM table_name

將巢狀資料轉換成 JSON

使用 to_json 函數將複雜資料類型轉換成 JSON。

Python

from pyspark.sql.functions import to_json

df.select(to_json("column_name").alias("json_name"))

SQL

SELECT to_json(column_name) AS json_name FROM table_name

若要編碼查詢或 DataFrame 的所有內容,請將這個與 struct(*) 結合。

Python

from pyspark.sql.functions import to_json, struct

df.select(to_json(struct("*")).alias("json_name"))

SQL

SELECT to_json(struct(*)) AS json_name FROM table_name

注意

Azure Databricks 也支援 to_avroto_protobuf 轉換複雜資料類型,以便與整合的系統互通。

將 JSON 資料轉換成複雜資料

使用 from_json 函數將 JSON 資料轉換成原生複雜資料類型。

注意

您無法指定 JSON 資料的結構描述。

Python

from pyspark.sql.functions import from_json

schema = "column1 STRING, column2 DOUBLE"

df.select(from_json("json_name", schema).alias("column_name"))

SQL

SELECT from_json(json_name, "column1 STRING, column2 DOUBLE") AS column_name FROM table_name

筆記本:轉換複雜的資料類型

下列筆記本提供使用 Python、Scala 和 SQL 複雜資料類型的範例。

轉換複雜資料類型 Python 筆記本

取得筆記本

轉換複雜資料類型 Scala 筆記本

取得筆記本

轉換複雜資料類型 SQL 筆記本

取得筆記本