使用 SQL 轉換資料
SparkSQL 程式庫提供了資料框架結構,也可讓您使用 SQL 作為處理資料的方式。 透過此方法,您可以使用 SQL 查詢來查詢和轉換資料框架中的資料,並將結果保存為資料表。
注意
資料表是檔案的中繼資料抽象概念。 資料不會儲存在關聯式資料表中,但資料表會在資料湖中的檔案上提供關係層。
定義資料表和檢視
Spark 中的資料表定義會儲存在「中繼存放區」中,這是一個中繼資料層,可封裝檔案上的關聯式抽象概念。 「外部」資料表是中繼存放區中的關聯式資料表,可參考您指定資料湖位置中的檔案。 您可以藉由查詢資料表或直接從資料湖讀取檔案,來存取此資料。
注意
外部資料表會「鬆散繫結」至基礎檔案,而刪除資料表「並不會」刪除檔案。 這可讓您使用 Spark 來執行繁重的轉換工作,然後將資料保存在資料湖中。 完成此動作之後,您可以卸除資料表,下游流程可以存取這些最佳化的結構。 您也可以定義「受控」資料表,其中基礎資料檔案會儲存在與中繼存放區相關聯的內部受控儲存位置。 受控資料表與檔案「緊密繫結」,卸除受控資料表會刪除相關聯的檔案。
下列程式碼範例會將資料框架 (從 CSV 檔案載入) 儲存為外部資料表名稱 sales_orders。 檔案會儲存在資料湖的 /sales_orders_table 資料夾。
order_details.write.saveAsTable('sales_orders', format='parquet', mode='overwrite', path='/sales_orders_table')
使用 SQL 查詢和轉換資料
定義資料表之後,您可以使用 SQL 來查詢和轉換其資料。 下列程式碼會建立兩個名為 Year 和 Month 的新衍生資料行,然後使用新增的新衍生資料行建立新的資料表 transformed_orders。
# Create derived columns
sql_transform = spark.sql("SELECT *, YEAR(OrderDate) AS Year, MONTH(OrderDate) AS Month FROM sales_orders")
# Save the results
sql_transform.write.partitionBy("Year","Month").saveAsTable('transformed_orders', format='parquet', mode='overwrite', path='/transformed_orders_table')
新資料表的資料檔案會儲存在資料夾階層中,格式為 Year=*NNNN* / Month=*N*,每個資料夾包含依年份和月份對應訂單的 Parquet 檔案。
查詢中繼存放區
由於這個新資料表是在中繼存放區中建立的,因此您可以使用 SQL 直接查詢,並在第一行中使用 %%sql 魔術機碼來指出會使用 SQL 語法,如下列指令碼所示:
%%sql
SELECT * FROM transformed_orders
WHERE Year = 2021
AND Month = 1
卸除資料表
使用外部資料表時,您可以使用 DROP
命令從中繼存放區刪除資料表定義,而不會影響資料湖中的檔案。 此方法讓您可以在使用 SQL 轉換資料之後清除中繼存放區,同時將轉換的資料檔案提供給下游資料分析和擷取程序使用。
%%sql
DROP TABLE transformed_orders;
DROP TABLE sales_orders;