共用方式為


在 Databricks SQL 中使用串流數據表

Databricks 建議使用串流數據表來使用 Databricks SQL 內嵌數據。 串流數據表 是註冊至 Unity 目錄的數據表,可額外支援串流或增量數據處理。 系統會自動為每個串流數據表建立管線。 您可以使用串流資料表從 Kafka 和雲端物件記憶體載入累加資料。

備註

若要瞭解如何使用 Delta Lake 資料表作為串流來源和接點,請參閱 Delta 資料表串流讀取和寫入

需求

若要使用串流數據表,您必須符合下列需求。

工作區需求

在 Databricks SQL 中建立的串流資料表是由無伺服器管線所支援。 您的工作區必須支持無伺服器管線才能使用這項功能。

計算需求

您可以使用下列其中一項:

  • 使用 Current 通道的 SQL 倉儲。
  • 在 Databricks Runtime 13.3 LTS 或更新版本上使用標準存取模式(先前稱為共用存取模式)進行計算。
  • 在 Databricks Runtime 15.4 LTS 或更新版本上使用專用存取模式(先前稱為單一使用者存取模式)進行計算。

    Databricks Runtime 15.3 和以下版本上,您無法使用專用計算來查詢 其他使用者所擁有的串流數據表,。 只有在您擁有串流數據表時,才能在 Databricks Runtime 15.3 和以下使用專用計算。 此表格的製作者是所有者。

    Databricks Runtime 15.4 LTS 和更新版本支援在專用計算上查詢管線產生的資料表,即使您不是資料表擁有者也一樣。 當您使用專用計算來執行資料篩選作業時,可能會向您收取無伺服器計算資源的費用。 請參閱 專用計算的細微訪問控制

權限需求

  • USE CATALOG 以及 USE SCHEMA 您在其中建立串流數據表之目錄和架構的許可權。
  • 您所建立串流表所屬結構上的 CREATE TABLE 許可權。
  • 用於存取資料表或位置的許可權,這些資料表或位置提供串流表所需的原始資料。

建立串流數據表

串流數據表是由 Databricks SQL 中的 SQL 查詢所定義。 當您建立串流數據表時,源數據表中目前的數據會用來建置串流數據表。 之後,您通常會依排程重新整理數據表,以提取源數據表中新增的任何數據,以附加至串流數據表。

當您建立串流數據表時,會被視為數據表的擁有者。

若要從現有的數據表建立串流數據表,請使用 CREATE STREAMING TABLE 語句,如下列範例所示:

CREATE OR REFRESH STREAMING TABLE sales
  SCHEDULE EVERY 1 hour
  AS SELECT product, price FROM STREAM raw_data;

在此情況下,串流資料表 sales 是從表格 raw_data 的特定欄位建立,排程為每小時重新整理一次。 使用的查詢必須是 串流 查詢。 使用STREAM關鍵詞,來使用串流語意從來源讀取。

當您使用 CREATE OR REFRESH STREAMING TABLE 語句建立串流表格時,初始化數據刷新和填入會立即開始。 這些作業不會取用 DBSQL 倉儲計算。 相反地,串流資料表依賴無伺服器管線來建立和重新整理。 系統會自動為每個串流數據表建立及管理專用無伺服器管線。

使用自動載入器載入檔案

若要從磁碟區中的檔案建立串流數據表,您可以使用自動載入器。 使用自動載入器來執行雲端物件儲存中的大部分資料擷取工作。 自動載入器和管線設計為以增量和冪等方式載入不斷增加的數據,當資料到達雲端儲存時。

若要在 Databricks SQL 中使用自動載入器,請使用 函式 read_files 。 下列範例示範如何使用自動載入器將 JSON 檔案磁碟區讀入串流數據表:

CREATE OR REFRESH STREAMING TABLE sales
  SCHEDULE EVERY 1 hour
  AS SELECT * FROM STREAM read_files(
    "/Volumes/my_catalog/my_schema/my_volume/path/to/data",
    format => "json"
  );

若要從雲端記憶體讀取資料,您也可以使用自動載入器:

CREATE OR REFRESH STREAMING TABLE sales
  SCHEDULE EVERY 1 hour
  AS SELECT *
  FROM STREAM read_files(
    'abfss://myContainer@myStorageAccount.dfs.core.windows.net/analysis/*/*/*.json',
    format => "json"
  );

若要了解自動載入器,請參閱 什麼是自動載入器?。 若要深入瞭解如何在 SQL 中使用自動載入器,以及範例,請參閱 從物件記憶體載入數據

從其他來源串流擷取數據

例如,若要了解如何從其他來源(包括 Kafka)匯入資料,請參閱 在管線中載入資料

僅導入新資料

根據預設,read_files 函式會在數據表建立期間讀取源目錄中的所有現有數據,然後使用每次重新整理處理新抵達的記錄。

若要避免在建立資料表時內嵌來源目錄中的數據,請將 [includeExistingFiles] 選項設定為 false。 這表示只有在建立數據表後抵達目錄的數據才會被處理。 例如:

CREATE OR REFRESH STREAMING TABLE sales
  SCHEDULE EVERY 1 hour
  AS SELECT *
  FROM STREAM read_files(
    '/path/to/files',
    includeExistingFiles => false
  );

設定運行時間通道

使用 SQL 倉儲建立的串流數據表會自動使用管線重新整理。 管道預設會在 current 通道中使用執行階段。 請參閱 Lakeflow Spark 宣告式管線版本資訊和版本升級程式, 以瞭解發行程式。

Databricks 建議針對生產工作負載使用 current 通道。 新功能會優先發佈到preview頻道。 您可以將管線設置為預覽通道,藉由將 preview 指定為資料表屬性來測試新功能。 您可以在建立資料表時或在使用 ALTER 語句建立資料表之後指定這個屬性。

下列程式代碼範例示範如何在 CREATE 語句中將通道設定為預覽:

CREATE OR REFRESH STREAMING TABLE sales
  TBLPROPERTIES ('pipelines.channel' = 'preview')
  SCHEDULE EVERY 1 hour
  AS SELECT *
  FROM STREAM raw_data;

排程串流資料表重新整理

您可以將 Databricks SQL 串流資料表設定為根據定義的排程自動重新整理,或在上游資料變更時觸發。

這很重要

TRIGGER ON UPDATE 功能處於 測試階段

若要設定排程或觸發程序,請執行下列其中一項:

  • 建立SCHEDULE時,使用子句設定排程。
  • 建立資料表時,使用子句設定 TRIGGER ON UPDATE 觸發程式。
  • 使用陳述式新增 ALTER STREAMING TABLE 或修改排程或觸發程式。

備註

或者,在包含 或CREATE OR REFRESH STREAMING TABLEREFRESH陳述式的工作中建立工作,並像協調任何其他工作一樣協調它。 請參閱 Lakeflow 職位

當您建立排程時,Azure Databricks 會自動建立新的作業來處理更新。

若要檢視排程,請執行下列其中一項動作:

  • 從 Azure Databricks UI 中的 SQL 編輯器執行 DESCRIBE EXTENDED 陳述式。 請參閱 DESCRIBE TABLE
  • 使用「目錄總管」來檢視串流表格。 排程會列出在 [概觀] 索引標籤的 [重新整理狀態] 底下。 請參閱 什麼是目錄總管?

即使有重新整理排程,如果您需要更新的資料,也可以隨時執行手動重新整理。

隱藏敏感數據

您可以使用串流資料表來隱藏存取資料表的使用者的敏感數據。 其中一種方法是定義查詢,使其完全排除敏感性數據行或數據列。 或者,您可以根據查詢使用者的許可權來套用數據行遮罩或數據列篩選。 例如,您可以對不在群組中的使用者隱藏數據欄 tax_idHumanResourcesDept。 若要這樣做,請在建立串流數據表期間使用 ROW FILTERMASK 語法。 如需詳細資訊,請參閱 數據列篩選和數據行遮罩

重新整理串流數據表

在您建立串流數據表時,可以自動排程更新。 您也可以手動重新整理串流數據表。 即使您有排程的重新整理,您隨時都可以呼叫手動重新整理。 刷新將由與串流資料表一起自動建立的相同管線來處理。

若要重新整理串流資料表:

REFRESH STREAMING TABLE sales;

您可以使用DESCRIBE TABLE EXTENDED 檢查最新更新的狀態。

備註

您可能需要先重新整理串流數據表,再使用 時間移動 查詢。

重新整理的運作方式

串流數據表重新整理只會評估自上次更新之後抵達的新數據列,並且只附加新的數據。

每次重新整理都會使用串流數據表的目前定義來處理這個新數據。 修改串流數據表定義不會自動重新計算現有的數據。 如果修改與現有數據不相容(例如變更數據類型),則下一次重新整理將會失敗並出現錯誤。

下列範例說明串流數據表定義的變更如何影響重新整理行為:

  • 拿掉篩選將不會重新處理先前篩選的數據列。
  • 變更數據行投影不會影響現有數據的處理方式。
  • 與靜態快照聯結會在初始處理時使用快照狀態。 延遲抵達的數據如果與更新後的快照相符將會被忽略。 如果維度延遲,這可能會導致事實被捨棄。
  • 修改現有資料行的 CAST 會導致錯誤。

如果您的資料以現有串流資料表中無法支援的方式變更,您可以執行完整重新整理。

完全重新整理串流數據表

完整重新整理會根據最新的定義重新處理來源中所有可用的資料。 不建議對於不保留完整數據歷程記錄或僅有較短保留期限的來源(例如 Kafka)呼叫完整重新整理,因為完整重新整理會截斷現有的數據。 如果資料來源中的資料不再可供使用,您可能無法復原舊資料。

例如:

REFRESH STREAMING TABLE sales FULL;

變更串流數據表的排程

您可以修改串流資料表的自動重新整理排程(或設定)。 下列範例示範如何使用 ALTER STREAMING TABLE 來設定排程:

ALTER STREAMING TABLE sales
  ADD SCHEDULE EVERY 1 HOUR;

-- Alters the schedule to refresh the streaming table when its upstream data
-- gets updated.
ALTER STREAMING TABLE sales
  ALTER TRIGGER ON UPDATE;

如需重新整理排程查詢的範例,請參閱 ALTER STREAMING TABLE

追蹤更新狀態

您可以在管線 UI 中檢視管理串流資料表的管線,或檢視串流資料表命令所傳回的DESCRIBE EXTENDED,以檢視串流資料表重新整理的狀態。

DESCRIBE TABLE EXTENDED <table-name>;

或者,您可以在目錄總管中檢視串流數據表,並查看該處的重新整理狀態:

  1. 按一下[資料] 圖示。在側邊欄中點擊目錄
  2. 在左側的目錄總管樹狀目錄中,開啟目錄,然後選取串流數據表所在的架構。
  3. 開啟您所選取架構底下的 資料表 項目,然後點擊串流表格。

您可以從這裡使用串流資料表名稱下的索引標籤來檢視和編輯串流資料表的相關資訊,包括:

  • 重新整理狀態和歷程記錄
  • 數據表架構
  • 範例資料(需要作用中的計算)
  • 權限
  • 譜系,包括此串流數據表相依的數據表和管線
  • 使用情況的深入解析
  • 您為這個串流數據表建立的監控項目

重新整理的超時設置

長時間執行的刷新可能會超時。 在 2025 年 8 月 14 日之後建立或重新整理的串流資料表,將會使用與用來執行重新整理之 SQL 倉儲相關聯的逾時。 如果倉庫沒有設定逾時,則會使用預設值 2 天。

備註

串流資料表只會在您手動執行 CREATE OR REFRESH 陳述式時同步超時設定。 排程更新會保留最近一次 CREATE OR REFRESH的超時。

您可以在 SQL 配置中使用 STATEMENT_TIMEOUT 明確設置逾時,以便刷新。 請參閱 STATEMENT_TIMEOUT

控制串流數據表的存取

串流數據表支援豐富的訪問控制,以支援數據共享,同時避免公開潛在的私人數據。 具有許可權的 MANAGE 串流數據表擁有者或使用者可以將許可權授與其他 SELECT 使用者。 具有 SELECT 串流數據表存取權的使用者不需要 SELECT 存取串流數據表所參考的數據表。 此存取控制可啟用資料共用,同時控制基礎資料的存取。

你也可以修改串流表的擁有者。

將許可權授予串流表

若要授與串流數據表的存取權,請使用 GRANT 語句

GRANT <privilege_type> ON <st_name> TO <principal>;

privilege_type可以是:

  • SELECT - 使用者可以 SELECT 串流資料表。
  • REFRESH - 使用者可以 REFRESH 串流資料表。 刷新是採用擁有者的權限來執行。

下列範例會建立串流數據表,並將選取和重新整理許可權授與使用者:

CREATE MATERIALIZED VIEW st_name AS SELECT * FROM source_table;

-- Grant read-only access:
GRANT SELECT ON st_name TO read_only_user;

-- Grand read and refresh access:
GRANT SELECT ON st_name TO refresh_user;
GRANT REFRESH ON st_name TO refresh_user;

如需在 Unity 目錄安全性實體物件上授與權限的詳細資訊,請參閱 Unity 目錄許可權和安全性實體物件

撤銷串流資料表的許可權

若要撤銷串流數據表的存取權,請使用 REVOKE 語句

REVOKE privilege_type ON <st_name> FROM principal;

從源數據表撤銷SELECT的許可權、或撤銷授予串流數據表擁有者或任何其他使用者的MANAGESELECT許可權,或者當源數據表被卸除時,串流數據表的擁有者或獲得存取權的使用者仍然可以查詢串流數據表。 但是,會發生下列行為:

  • 串流數據表擁有者或其他失去串流數據表存取權的人無法再 REFRESH 使用該串流數據表,而且串流數據表會變成過時。
  • 如果使用排程進行自動化,則下一個排程的 REFRESH 會失敗或未執行。

下列範例會撤銷 SELECTread_only_user 權限:

REVOKE SELECT ON st_name FROM read_only_user;

更改串流表的擁有者

擁有 MANAGE Databricks SQL 中串流資料表權限的使用者,可以透過目錄總管設定新的擁有者。 新擁有者可以是他們自己,或是具備 服務主體使用者 角色的服務主體。

  1. 從你的 Azure Databricks 工作區,點選資料圖示。目錄以開啟目錄瀏覽器。

  2. 選擇你想更新的串流表。

  3. 在右側邊欄,於 關於這個串流表 下,找到 擁有者,然後點擊 鉛筆圖示 進行編輯。

    備註

    如果你收到訊息,要求你在管線設定中更改 以使用者身份執行 來更新擁有者,那麼串流表是在 Lakeflow Spark 宣告式管線中定義的,不是 Databricks SQL 裡。 訊息中附有管道設定連結,你可以在那裡更改 以使用者身份執行

  4. 為資料串流表選擇新的擁有者。

    擁有者自動擁有他們所擁有的串流表上的MANAGESELECT權限。 如果你將服務主體設定為你擁有的串流資料表的擁有者,而你沒有被明確授予 SELECTMANAGE 權限,那麼此變更將導致你失去對該串流資料表的所有存取權。 在這種情況下,你會被明確提示提供這些特權。

    同時選擇 Grant MANAGEGrant SELECT 權限,以提供對 Save 的使用權限。

  5. 點擊 儲存 以更改擁有者。

串流表的擁有者已更新。 所有未來的更新都會使用新擁有者的身分來執行。

當擁有者失去原始資料表的權限時

如果你更改了擁有者,而新擁有者沒有原始資料表的存取權(或 SELECT 底層來源資料表的權限被撤銷),使用者仍然可以查詢串流資料表。 但是:

  • 他們無法使用REFRESH串流資料表。
  • 下一次預定的串流表刷新會失敗。

失去對來源資料的存取權會阻止更新,但不會立即使現有的串流資料表無法被讀取。

從串流數據表永久刪除記錄

這很重要

對具有串流數據表的 REORG 語句的支援,公開預覽版

備註

  • 搭配串流數據表使用 REORG 語句需要 Databricks Runtime 15.4 及更高版本。
  • 雖然您可以將語句與任何串流數據表搭配使用 REORG ,但只有在從已啟用 刪除向量 之串流數據表中刪除記錄時,才需要此語句。 命令在未啟用刪除向量的情況下,與串流數據表搭配使用時沒有作用。

要實際從已啟用刪除向量的串流資料表的基礎儲存體中刪除記錄,例如,為了滿足 GDPR 合規性,必須採取額外步驟,以確保 VACUUM 作業執行於串流資料表資料上。

若要從基礎記憶體實際刪除記錄:

  1. 從串流數據表更新記錄或刪除記錄。
  2. 針對數據流數據表執行 REORG 語句,並指定 APPLY (PURGE) 參數。 例如 REORG TABLE <streaming-table-name> APPLY (PURGE);
  3. 等候串流資料表的資料保留期結束。 默認數據保留期間為七天,但可以使用 delta.deletedFileRetentionDuration 數據表屬性來設定。 請參閱設定時光旅行查詢中的資料保留政策
  4. REFRESH 串流數據表。 請參閱 重新整理串流數據表。 在作業後的 REFRESH 24 小時內,管道維護任務(包括為確保永久刪除記錄而必須進行的 VACUUM 作業)會自動執行。

使用查詢歷程記錄來監控運行

您可以使用查詢歷程記錄頁面來存取查詢詳細資料和查詢設定檔,以協助您識別用來執行串流資料表更新的管線中效能不佳的查詢和瓶頸。 如需查詢歷程記錄和查詢配置檔中可用資訊種類的概觀,請參閱 查詢歷程記錄查詢配置檔

這很重要

這項功能目前處於 公開預覽版。 工作區管理員可以從 「預覽 」頁面控制對此功能的存取。 請參閱 管理 Azure Databricks 預覽。

與串流數據表相關的所有語句都會出現在查詢記錄中。 您可以使用 [語句 ] 下拉式篩選來選取任何命令,並檢查相關的查詢。 所有 CREATE 語句後面都跟著一個在管線上以異步方式執行的 REFRESH 語句。 這些 REFRESH 語句通常包含詳細的查詢計劃,以提供優化效能的見解。

若要存取 REFRESH 查詢歷程記錄 UI 中的語句,請使用下列步驟:

  1. 請單擊歷程圖示以在左側邊欄中開啟查詢歷史 UI。
  2. 在 [REFRESH] 下拉式篩選中選取 [] 複選框。
  3. 按兩下查詢語句的名稱,即可檢視摘要詳細數據,例如查詢的持續時間和匯總計量。
  4. 按兩下 [ 查看查詢設定檔 ] 以開啟查詢設定檔。 如需巡覽查詢配置檔的詳細資訊,請參閱 查詢配置檔
  5. 您可以選擇性地使用 [查詢來源] 區段中的連結來開啟相關的查詢或管線。

您也可以使用 SQL 編輯器中的連結,或從附加至 SQL 倉儲的筆記本存取查詢詳細數據。

從外部用戶端存取串流資料表

若要從不支援開放 API 的外部 Delta Lake 或 Iceberg 用戶端存取串流資料表,您可以使用 相容性模式。 相容性模式會建立串流資料表的唯讀版本,任何 Delta Lake 或 Iceberg 用戶端都可以存取。

其他資源