使用 SQL 方法擷取資料
SQL 指令在 Azure Databricks 中提供宣告式的資料擷取方法。 如果你已經熟悉 SQL 語法,這些方法可以讓你建立並填充資料表,而不必寫程序式程式碼。 三種主要的 SQL 擷取技術——CREATE TABLE AS SELECT (CTAS)、、 CREATE OR REPLACE TABLE和 COPY INTO——各自針對不同的擷取情境,同時維持與 Unity Catalog 的完全相容性。
使用 CTAS 從查詢建立資料表
該 CREATE TABLE AS SELECT 語句將資料表建立與資料人口合併為單一操作。 你可以根據查詢結果 SELECT 定義一個新資料表,非常適合在擷取時轉換資料。
假設你需要從外部來源接收客戶資料並套用轉換。 使用 CTAS,你寫一個查詢,從來源讀取,套用轉換,並將結果儲存到新的受管理資料表:
CREATE TABLE catalog.schema.customers AS
SELECT
customer_id,
UPPER(customer_name) AS customer_name,
email,
created_date
FROM external_staging.raw_customers
WHERE customer_status = 'active';
表格結構是自動從查詢結果推導出來的。 Azure Databricks 預設使用 Delta 格式建立資料表,提供 ACID 交易、時間旅行及最佳效能。
CTAS 在初始資料載入和一次性遷移方面表現良好。 當你需要從檔案讀取資料時,將 CTAS 與 read_files table-value 函數結合:
CREATE TABLE catalog.schema.sales_data AS
SELECT * FROM read_files(
'/Volumes/catalog/schema/volume/sales/*.parquet',
format => 'parquet'
);
備註
CTAS 每次執行都會建立一個新的資料表。 如果該表已經存在,指令會失敗,除非你使用該 IF NOT EXISTS 子句——但該子句會跳過執行,而非更新表格。
用 CREATE 或 REPLACE TABLE 來刷新資料表
當你需要完全刷新資料表內容時, CREATE OR REPLACE TABLE 提供了乾淨的解決方案。 這個指令要麼建立新資料表,要麼完全取代現有資料表,保留資料表歷史、授予的權限,以及你設定的任何列過濾器或欄位遮罩。
這種方法對於定期資料更新特別有用,尤其是當你想要替換所有現有資料時:
CREATE OR REPLACE TABLE catalog.schema.daily_metrics AS
SELECT
report_date,
SUM(revenue) AS total_revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM catalog.schema.transactions
WHERE report_date >= CURRENT_DATE - INTERVAL 30 DAYS
GROUP BY report_date;
與刪除並重建資料表不同,CREATE OR REPLACE 維護了資料表的元資料與權限。 下游使用者與應用程式仍可直接存取資料表,無需重新設定。
你也可以用這個指令直接從檔案載入資料。 該結構是從查詢結果自動推斷出來的:
CREATE OR REPLACE TABLE catalog.schema.products AS
SELECT * FROM read_files(
'/Volumes/catalog/schema/volume/products.csv',
format => 'csv',
header => true
);
這很重要
CREATE OR REPLACE 會執行整個資料表的取代。 對於只想新增紀錄的增量更新,請改用 COPY INTO 。
使用 COPY INTO 逐步載入檔案
COPY INTO 解決了一個常見的擷取挑戰:以可靠且可重複的方式從雲端儲存載入檔案。 與 CTAS 不同,CTAS 只執行一次並建立資料表,而 COPY INTO 則設計用於持續進行的資料導入工作流程,以便新檔案能夠定期抵達。
指令會從指定位置讀取檔案,並將其附加到現有的 Delta 資料表。 其關鍵功能是冪等性:已載入的檔案會自動略過,即使跨多次執行亦然:
COPY INTO catalog.schema.events
FROM '/Volumes/catalog/schema/volume/events/'
FILEFORMAT = JSON
FORMAT_OPTIONS ('multiline' = 'true');
在執行 COPY INTO之前,目標表必須已經存在。 用適當的架構建立它:
CREATE TABLE IF NOT EXISTS catalog.schema.events (
event_id STRING,
event_type STRING,
event_timestamp TIMESTAMP,
payload STRING
);
設定檔案選擇
當你的來源目錄包含不同檔案命名格式,或需要載入特定檔案時,請使用以下選項:PATTERN 或 FILES
-- Load only files matching a pattern
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
PATTERN = 'orders_2024*.parquet';
-- Load specific files by name
COPY INTO catalog.schema.orders
FROM '/Volumes/catalog/schema/volume/orders/'
FILEFORMAT = PARQUET
FILES = ('orders_001.parquet', 'orders_002.parquet');
處理結構與資料品質
COPY INTO 提供處理結構變更及載入前驗證資料的選項:
COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
FORMAT_OPTIONS (
'header' = 'true',
'inferSchema' = 'true'
)
COPY_OPTIONS ('mergeSchema' = 'true');
此 mergeSchema 選項允許資料表結構隨著新欄位出現於原始碼檔案中而演進。 若要驗證資料而不載入資料,請加入 VALIDATE 子句:
COPY INTO catalog.schema.sensor_data
FROM '/Volumes/catalog/schema/volume/sensors/'
FILEFORMAT = CSV
VALIDATE ALL;
此驗證檢查資料是否可解析、與資料表結構相符,並符合空性與檢查約束。
選擇正確的方法
每種 SQL 匯入方法在您的資料工程工作流程中都有不同的用途:
| 方法 | 適用對象 | 行為 |
|---|---|---|
| CTAS | 初始資料載入、一次性遷移、從查詢建立資料表 | 建立一個新資料表;如果資料表存在,則操作失敗。 |
| 建立或替換 | 定期全面刷新,替換預備表 | 取代整個資料表;保留權限 |
| 複製到 | 持續檔案匯入,增量式載入 | 附加於現有表格;跳過載入的檔案 |
對於需要自動架構推論、檔案通知或精確一次保證的檔案擷取,建議使用 Auto Loader 作為輔助方法。 當你的擷取需求簡單且偏好宣告式 SQL 而非程序式程式碼時,這三種方法提供了完整的工具包,幫助管理 Unity Catalog 的資料流。
備註
當隨著時間以數千個檔案的規模進行內嵌時,COPY INTO 可良好運作。 對於檔案數量將成長到數百萬甚至更多的資料來源,推薦使用 Auto Loader(下一單元會介紹)——它能更有效率地發現檔案,支援更豐富的結構演進,且可擴展且無需目錄列表的負擔。 Databricks 也建議使用由 AutoLoader 支援的串流資料表,作為基於 SQL 檔案擷取的可擴展且長期替代方案。