在 Snowflake 上執行同盟查詢 (OAuth)

此頁面說明如何設定 Lakehouse 同盟,在 Azure Databricks 未管理的 Snowflake 數據上執行同盟查詢。 欲了解更多湖屋聯盟資訊,請參閱 「連結外部資料庫與目錄」

要使用 Lakehouse Federation 連接你的 Snowflake 資料庫,必須在你的 Azure Databricks Unity 目錄中建立以下內容(2023 年 11 月 9 日後建立的工作區已自動配置 Unity 目錄中繼倉庫):

  • 與 Snowflake 資料庫的連接。
  • 外部目錄,鏡像 Unity 目錄中的 Snowflake 資料庫,讓您可以使用 Unity 目錄查詢語法和數據控管工具來管理 Azure Databricks 使用者對資料庫的存取權。

本頁說明如何使用 Snowflake 內建的 OAuth 整合,對 Snowflake 資料執行聯合查詢。 如需其他驗證方法,請參閱下列頁面:

您可以使用查詢同盟或目錄同盟,在 Snowflake 上執行同盟查詢。

在查詢同盟中,JDBC 會將 Unity 目錄查詢向下推送至外部資料庫。 這適用於 ETL 管線上的即需報告或概念驗證工作。

在目錄同盟中,Unity 目錄查詢會直接針對檔案記憶體執行。 這種方法在不需要調整程式碼的情況下,對於逐步移轉非常有幫助,或作為需要在 Snowflake 中維護部分數據並將其數據註冊在 Unity Catalog 的組織的一種更長期的混合模式。 請參閱 啟用 Snowflake 目錄聯邦。

查詢同盟

開始之前

工作區需求:

  • Unity 目錄的工作區已啟用。 2023 年 11 月 9 日之後建立的工作區將自動啟用 Unity Catalog,包括自動進行 metastore 配置。 除非你的工作區早於自動啟用且還沒啟用 Unity Catalog,否則你不需要手動建立元商店。 請參閱 開始使用 Unity 目錄。

計算需求:

  • 從您的計算資源到目標資料庫系統的網路連線狀況。 請參閱 Lakehouse 同盟的網路建議。
  • Azure Databricks 計算必須使用 Databricks Runtime 13.3 LTS 或更新版本,以及 標準 或 專用的 存取模式。
  • SQL 倉儲必須是專業或無伺服器,且必須使用 2023.40 或更新版本。

需要的權限:

  • 若要建立連線,您必須是中繼存放區系統管理員,或是具有附加至工作區之 Unity 目錄中繼存放區 CREATE CONNECTION 許可權的使用者。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此 CREATE CONNECTION 權限。
  • 若要建立外部目錄,您必須在中繼存放區擁有 CREATE CATALOG 權限,並且必須是連線的擁有者,或在連線上擁有 CREATE FOREIGN CATALOG 權限。 在自動啟用 Unity 目錄的工作區中,工作區管理員預設擁有此 CREATE CATALOG 權限。

在每個後續的任務導向章節中指定了額外的權限需求。

建立安全性整合

在 Snowflake 控制台中,執行 CREATE SECURITY INTEGRATION。 取代下列值:

  • <integration-name>:您 OAuth 整合的唯一名稱。

  • <workspace-url>:Azure Databricks 工作區 URL。 您必須將 OAUTH_REDIRECT_URI 設定為 https://<workspace-url>/login/oauth/snowflake.html,其中 <workspace-url> 是您將建立 Snowflake 連線之 Azure Databricks 工作區的唯一 URL。

  • <duration-in-seconds>:刷新令牌的時間長度。

    Important

    OAUTH_REFRESH_TOKEN_VALIDITY 是預設設為90天的自訂欄位。 更新令牌到期之後,您必須重新驗證這個連線。 將欄位設定為合理的時間長度。

例如:

CREATE SECURITY INTEGRATION <integration-name>
TYPE = oauth
ENABLED = true
OAUTH_CLIENT = custom
OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
OAUTH_REDIRECT_URI = 'https://<workspace-url>/login/oauth/snowflake.html'
OAUTH_ISSUE_REFRESH_TOKENS = TRUE
OAUTH_REFRESH_TOKEN_VALIDITY = <duration-in-seconds>
OAUTH_ENFORCE_PKCE = TRUE;

建立連線

連接會指定用來存取外部資料庫系統的路徑和認證。 若要建立連線,您可以在 Azure Databricks 筆記本或 Databricks SQL 查詢編輯器中使用目錄總管或 CREATE CONNECTION SQL 命令。

Note

您也可使用 Databricks REST API 或 Databricks CLI 來建立連線。 請參閱 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。

需要的權限:具有 CREATE CONNECTION 權限的中繼存放區系統管理員或使用者。

  1. 在您的 Azure Databricks 工作區中,按兩下 [資料] 圖示。目錄。

  2. 在「目錄」窗格頂端,按一下「新增」或加號圖示「新增」圖示,然後從功能表中選取「建立連線」。

  3. 在 [連線基本概念] 頁面的 [設定連線 精靈] 中,輸入一個使用者易於記憶的 連線名稱。

  4. 請選擇 Snowflake 的 連線類型。

  5. 針對 [驗證類型],從下拉功能表中選取 OAuth 。

  6. (選擇性) 新增註解。

  7. 按 [下一步]。

  8. 輸入雪花倉儲的下列驗證和聯機詳細數據。

    • 主機:例如 snowflake-demo.east-us-2.azure.snowflakecomputing.com

    • 埠:例如 443

    • 使用者:例如 snowflake-user

    • 用戶端標識碼:在 Snowflake 控制台中,執行 SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('<security-integration-name>') 以擷取安全性整合的用戶端標識碼。

    • 客戶端密碼:在 Snowflake 控制台中,執行 SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('<security-integration-name>') 以擷取安全性整合的客戶端密碼。

    • OAuth 範圍: refresh_token session:role:<role-name>。 指定要在<role-name>中使用的Snowflake角色。

    • 使用 Snowflake 登入:使用您的 OAuth 認證按兩下並登入 Snowflake。

      成功登入時,系統會將您導向回 設定連線 精靈。

  9. 點選 「建立連線」。

  10. 在 目錄基本頁面 上,輸入外來目錄的名稱。 外部目錄會鏡像外部數據系統中的資料庫,讓您可以使用 Azure Databricks 和 Unity 目錄來查詢和管理該資料庫中數據的存取權。

  11. (選擇性)按兩下 [ 測試連線 ] 以確認其運作正常。

  12. 點選 「建立目錄」。

  13. 在 [Access] 頁面上,選擇允許使用者存取您所建立的目錄的工作區。 您可以選取 [所有工作區都有存取權],或點擊 [指派給工作區],選取工作區,然後點擊 [指派]。

  14. 將 擁有者 變更為可以管理目錄中所有物件存取權的人。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。

  15. 在目錄上授予 許可權。 請點擊授與:

    1. 指定 主體 誰可以存取目錄中的物件。 在文字框中開始輸入對象,然後在搜尋結果中點擊該對象。
    2. 選取 權限預設,以授與每個主體。 根據預設,所有帳戶用戶都會被授與 BROWSE。
      • 從下拉功能表中選取 [數據讀取器],以授與目錄中物件 read 許可權。
      • 從下拉功能表中選取 [數據編輯器],以授與目錄中物件的 read 和 modify 許可權。
      • 手動選取要授與的許可權。
    3. 請按一下 授權。
  16. 按 [下一步]。

  17. 在 [元數據] 頁面上,指定標籤的鍵-值配對。 如需詳細資訊,請參閱 將標籤套用至 Unity Catalog 可保護的物件。

  18. (選擇性) 新增註解。

  19. 點選 [儲存]。

進階連線選項

Snowflake 連線支援下列進階選項,適用於受限輸出或私有連線環境:

  • disableOCSPChecks: 設定為 true 以停用 Snowflake JDBC 驅動程式中的線上憑證狀態協定(OCSP)憑證撤銷檢查。 關閉 OCSP 檢查可以跳過證書吊銷檢查。

Important

盡可能允許外撥流量至 Snowflake OCSP 回應者。 保持 disableOCSPChecks 不設定或設定為 false。 只有在您的受限輸出或私有連線設定無法允許這類流量通過時,才將它設為 true。

這個選項在目錄檔案總管中並未顯示。 你可以在用 SQL 建立連線時設定:

CREATE CONNECTION <connection-name> TYPE snowflake
OPTIONS (
  <connection-options>,
  disableOCSPChecks 'true'
);

對於已有的連線,請使用 ALTER CONNECTION。

區分大小寫的資料庫識別碼

外部目錄的 [database] 字段會對應至 Snowflake 資料庫識別碼。 如果 Snowflake 資料庫識別碼不區分大小寫,那麼您在外部目錄 <database-name> 中使用的大小寫將會被保留。 不過,如果 Snowflake 資料庫識別符區分大小寫,您必須將外部目錄 <database-name> 用雙引號括起來,以保留大小寫。

例如:

  • database 已轉換成 DATABASE

  • "database" 已轉換成 database

  • "database""" 已轉換成 database"

    若要逸出雙引號,請使用另一個雙引號。

  • "database"" 會導致錯誤,因為雙引號未正確轉義。

如需詳細資訊,請參閱 Snowflake 檔中的 標識符需求。

支援的下推策略

支援以下下推功能:

  • Filters
  • Projections
  • Limit
  • Offset
  • Joins
  • 匯總函數(Average、Corr、CovPopulation、CovSample、Count、Max、Min、StddevPop、StddevSamp、Sum、VariancePop、VarianceSamp)
  • 函式(字串函式、數學函式、日期、時間與時間戳記函式,以及其他雜項函式,例如別名、型別轉換、排序次序)
  • 視窗函式(DenseRank、Rank、RowNumber)
  • Sorting
  • Top-N(將排序與限制合併為單一操作),支援於 Databricks Runtime 17.3 及以上版本

資料類型對應

當您從 Snowflake 讀取至 Spark 時,資料類型會對應如下:

雪花類型 Spark 類型
decimal、number、numeric DecimalType
bigint、byteint、int、integer、smallint、tinyint IntegerType
float、float4、float8 FloatType
double、double precision、real DoubleType
char、character、string、text、time、varchar StringType
binary BinaryType
boolean BooleanType
date DateType
datetime、、 timestamp、 timestamp_ltz、 timestamp_ntz、 timestamp_tz TimestampType

查詢聯邦限制

  • Snowflake OAuth 端點必須可從 Azure Databricks 控制平面 IP 存取。 請參閱 來自 Azure Databricks 控制平面的輸出 IP。 Snowflake 支援在安全性整合層級設定網路原則,以允許個別的網路原則,以便從 Azure Databricks 控制平面直接連線到 OAuth 端點以進行授權。
  • 使用 Proxy、Proxy 主機、Proxy 埠和 Snowflake 角色設定選項不受支援。 指定 Snowflake 角色 作為 OAuth 範圍的一部分。
  • 包含 Unity Catalog 不支援的 Snowflake 特有資料類型欄位(例如 VECTOR)的外部資料表和檢視,無法透過 Lakehouse Federation 進行查詢。 Unity 目錄必須儲存外部資料表中所有欄位的元資料,因此不支援欄位類型會造成「不支援類型」錯誤,即使查詢未參考這些欄位。 為了解決這個問題,可以建立一個排除不支援欄位的 Snowflake 視圖,並查詢該視圖。

其他資源

請參閱 Snowflake 檔中的下列文章: