轉換複雜的資料類型
使用巢狀資料類型時,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()
函式,從 ARRAY
和 MAP
類型數據行解壓縮值。
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_avro
和 to_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 複雜資料類型的範例。