在 Amazon Redshift 上執行同盟查詢
本文說明如何 set up Lakehouse 同盟,在 Azure Databricks 未管理的 Amazon Redshift 數據上執行同盟查詢。 若要深入了解 Lakehouse 同盟,請參閱什麼是 Lakehouse 同盟?。
若要使用 Lakehouse 同盟連線至 Amazon Redshift 資料庫上的執行查詢,您必須在 Azure Databricks Unity Catalog 中繼存放區中建立下列專案:
- 在 Amazon Redshift 資料庫上執行查詢的連線。
- 外部 catalog,可鏡像在 Unity Catalog 的 Amazon Redshift 資料庫上執行查詢,讓您可以使用 Unity Catalog 查詢語法和數據控管工具來管理 Azure Databricks 使用者對資料庫的存取權。
開始之前
工作區需求:
- 針對 Unity Catalog啟用工作區。
計算需求:
- 從計算資源到目標資料庫系統的網路連接。 請參閱 Lakehouse 同盟的網路建議。
- Azure Databricks 計算必須使用 Databricks Runtime 13.3 LTS 或更新版本,共用 或 單一使用者 存取模式。
- SQL 倉儲必須是專業或無伺服器,且必須使用 2023.40 或更新版本。
所需的權限:
- 若要建立連線,您必須是中繼存放區的系統管理員,或是擁有附加至工作區的 Unity Catalog 中繼存放區之
CREATE CONNECTION
權限的使用者。 - 要建立外部 catalog,您必須在中繼存放區具備
CREATE CATALOG
許可權,並且必須是連線的擁有者或具備連線的CREATE FOREIGN CATALOG
權限。
後續每個基於工作的章節中會指定其他權限需求。
建立連線
連線指定了一條路徑和 credentials 來存取外部資料庫系統。 若要建立連線,您可以在 Azure Databricks 筆記本或 Databricks SQL 查詢編輯器中使用 Catalog Explorer 或 CREATE CONNECTION
SQL 命令。
注意
您也可使用 Databricks REST API 或 Databricks CLI 來建立連線。 請參閱 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。
需要的權限:具有 CREATE CONNECTION
權限的中繼存放區系統管理員或使用者。
Catalog 探索者
在 Azure Databricks 工作區中,按兩下
Catalog。
在 [Catalog] 窗格頂端,按兩下
[新增] 圖示,然後 select從功能表新增連線。
或者,從 [快速存取] 頁面,按兩下 [外部數據 >] 按鈕,移至 [Connections] 索引標籤,然後按兩下 [建立連線。
在 [連線 詳細數據] 頁面的 [Set 連線 嚮導] 上,輸入便於使用者記憶的 連線名稱。
Select 連線類型 的 Redshift。
(選擇性) 新增註解。
點選 [下一步]。
在 [驗證] 頁面上,輸入 Redshift 實例的下列連線屬性。
-
主機:例如
redshift-demo.us-west-2.redshift.amazonaws.com
-
埠:例如
5439
-
使用者:例如
redshift_user
-
密碼:例如
password123
-
主機:例如
(選擇性) 停用 SSL 主機名驗證。
點選 建立連線。
在 [Catalog 基本] 頁面上輸入外來 catalog的名稱。 外部 catalog 會鏡像外部數據系統中的資料庫,讓您可以使用 Azure Databricks 和 Unity Catalog查詢和管理該資料庫中數據的存取權。
(選擇性)按兩下 [ 測試連線 ] 以確認其運作正常。
按 [建立 catalog]。
在 [Access] 頁面上,select 使用者可以存取您所建立 catalog 的工作區。 您可以 select讓所有工作區都有存取權,或按一下 [指派工作區],select 這些工作區,然後按一下 [指派]。
變更 的所有者,使其能夠管理 catalog中所有物件的存取。 開始在文字框中輸入主體,然後按一下傳回的結果中的主體。
Grant 在 catalog上的 許可權。 請點擊 Grant:
- 指定 主體 誰可以存取 catalog中的物件。 開始在文字框中輸入主體,然後按一下傳回的結果中的主體。
-
Select
許可權預設grant 至每個主體。 根據預設,所有帳戶用戶都會被授與
BROWSE
。- 從下拉功能表中選擇 Select數據讀取器,以設定 catalog中的 grant
read
物件許可權。 - 從下拉功能表選擇 Select數據編輯器,然後對 grant
read
和modify
設定 catalog中對象的許可權。 - 手動將select的許可權賦予grant。
- 從下拉功能表中選擇 Select數據讀取器,以設定 catalog中的 grant
- 按兩下 [Grant]。
點選 [下一步]。
在 [元數據] 頁面上,指定標籤的鍵值對。 如需詳細資訊,請參閱 將標籤套用至 Unity Catalog 安全性實體物件。
(選擇性) 新增註解。
點擊 儲存。
SQL
在筆記本或 Databricks SQL 查詢編輯器中執行下列命令。
CREATE CONNECTION <connection-name> TYPE redshift
OPTIONS (
host '<hostname>',
port '<port>',
user '<user>',
password '<password>'
);
建議您使用 Azure Databricks 機密,而不是純文本字串,用於處理如 credentials類的敏感資訊 values。 例如:
CREATE CONNECTION <connection-name> TYPE redshift
OPTIONS (
host '<hostname>',
port '<port>',
user secret ('<secret-scope>','<secret-key-user>'),
password secret ('<secret-scope>','<secret-key-password>')
)
如需設定祕密的相關資訊,請參閱祕密管理。
建立外部 catalog
注意
如果您使用 UI 來建立資料來源的連線,則將自動包括 Foreign catalog 的建立,您可以略過此步驟。
外部 catalog 會鏡像外部數據系統中的資料庫,讓您可以使用 Azure Databricks 和 Unity Catalog查詢和管理該資料庫中數據的存取權。 若要建立外部 catalog,您可以使用已定義的數據源連線。
若要創建外部的 catalog,您可以在 Azure Databricks 筆記本或 SQL 查詢編輯器中使用 Catalog Explorer 或 CREATE FOREIGN CATALOG
SQL 命令。
您也可以使用 Databricks REST API 或 Databricks CLI 來建立 catalog。 請參閱 POST /api/2.1/unity-catalog/catalogs 和 Unity Catalog 命令。
必要權限:中繼存放區的 CREATE CATALOG
權限,以及連線的所有權或連線的 CREATE FOREIGN CATALOG
權限。
Catalog 探索者
在 Azure Databricks 工作區中,按兩下 [
Catalog 以開啟 Catalog Explorer。
在 [Catalog] 窗格頂端,單擊
[新增] 圖示,然後從功能表 select[新增 catalog]。
或者,從 [快速存取] 頁面中,點擊 [Catalogs] 按鈕,然後點擊 [建立 catalog] 按鈕。
請遵循在 Create catalogs中建立外部 catalogs 的指示。
SQL
在筆記本或 SQL 查詢編輯器中,執行下列 SQL 命令。 括弧中的項目是選擇性的。 替換佔位符 values:
-
<catalog-name>
:Azure Databricks 中 catalog 的名稱。 -
<connection-name>
:指定數據源、路徑和存取 credentials的 連接物件。 -
<database-name>
:您想要在 Azure Databricks 中鏡像為 catalog 的資料庫名稱。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (database '<database-name>');
支援的下推
支援下列下推:
- 篩選
- 投影
- Limit
- 聯結
- 匯總(Average、Count、Max、Min、StddevPop、StddevSamp、Sum、VarianceSamp)
- 函式(字串函式和其他函式,例如 Alias、Cast、SortOrder)
- 排序
不支援下列下推:
- 視窗函式
資料類型對應
當您從 Redshift 讀取至 Spark 時,資料類型會對應如下:
Redshift 類型 | Spark 類型 |
---|---|
numeric | DecimalType |
int2、int4 | IntegerType |
int8、 oid、 xid | LongType |
float4 | FloatType |
雙精確度, float8, money | DoubleType |
bpchar, char, character varying, name, super, text, tid, varchar | StringType |
bytea、geometry、varbyte | BinaryType |
bit、bool | BooleanType |
date | DateType |
tabstime, time, time with time zone, timetz, time without time zone, timestamp with time zone, timestamptz, timestamp without time zone* | TimestampType/TimestampNTZType |
*當您從 Redshift 讀取時,Redshift Timestamp
會對應至 Spark TimestampType
if infer_timestamp_ntz_type = false
(預設值)。 如果 Timestamp
,則 Redshift TimestampNTZType
會對應至 infer_timestamp_ntz_type = true
。