當您需要訪問儲存在Hologres中的資料時,MaxCompute支援使用外部表格訪問Hologres資料來源資料,無需匯入資料至MaxCompute中,實現快速查詢Hologres資料。本文為您介紹如何在外部表格建表語句中指定Hologres資料來源、STS認證資訊或開啟雙簽名開關、映射目標表、JDBC驅動資訊,來建立Hologres外部表格。
背景資訊
Hologres是相容PostgreSQL協議的即時互動式分析資料倉庫,在底層與MaxCompute無縫串連。
您可以使用在MaxCompute上建立Hologres外部表格的方式,基於PostgreSQL JDBC驅動及STS認證資訊查詢Hologres資料來源的資料。該方式無冗餘儲存,無需匯入匯出資料,可實現快速擷取查詢結果。
前提條件
建立Hologres外部表格前,請確認已經滿足如下條件:
已準備好Hologres資料庫及目標表。
建立Hologres資料庫資訊,請參見建立資料庫。
建立Hologres表資訊,請參見CREATE TABLE。
假設已準備好的Hologres執行個體資訊如下:
Hologres資料庫名稱:
mc_test
。Hologres資料庫的Schema:
public
。Hologres資料庫傳統網路串連地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80
。Hologres表名稱:
holo
。表資料如下:
已準備好待建立Hologres外部表格的目標MaxCompute專案。
建立MaxCompute專案資訊,請參見建立MaxCompute專案。
已安裝MaxCompute用戶端。
更多安裝MaxCompute用戶端操作,請參見安裝並配置MaxCompute用戶端。
使用限制
Hologres外部表格的使用限制如下:
MaxCompute不支援對建立的Hologres外部表格執行更新(UPDATE)、刪除(DELETE)操作。
Hologres的分區表和MaxCompute的分區表沒有對應關係。Hologres外部表格不支援分區。
當您需要向Hologres外部表格寫入大量資料時,採用並行多進程寫入方式,會小機率出現某個寫入進程資料重寫情況,導致資料重複。
MaxCompute裡建的Hologres外部表格,其中DECIMAL資料類型預設小數18位,不能修改,只能建成
decimal(38,18)
。如果小數位元比較少,可以在MaxCompute中建外部表格時資料類型選擇String,使用的時候再使用cast
函數強制轉換後使用。MaxCompute建立的Hologres外部表格,不支援Array,Map,Struct複雜資料類型。
在MaxCompute建立Hologres外部表格時,Hologres中有的JSON、JSONB、MONEY等資料類型,目前在MaxCompute沒有對應的資料類型,暫時不支援。
Hologres外部表格不支援cluster屬性。
注意事項
Hologres外部表格使用過程中需要注意:
如果Hologres開啟了IP白名單功能,使用者需要採用雙簽名模式建立Hologres外部表格。如果用STS模式建立Hologres外部表格,MaxCompute訪問Hologres時會被IP白名單攔截。
對於Hologres的父、子表,Hologres外部表格中會指定表名,並執行SQL語句。父、子表都可以映射至Hologres外部表格,但是父表只能讀不能寫。
向Hologres外部表格寫入資料時,暫不支援Hologres的INSERT ON CONFLICT(UPSERT)機制。如果Hologres源表有主鍵,請避免寫入的資料與Hologres源表中的資料產生主鍵唯一性衝突。
建表時,表名和欄位名大小寫不敏感。在查詢表或欄位時,無需區分大小寫,且不支援強制轉換大小寫。
建立Hologres外部表格文法
在建立外部表格時,您需要在建表DDL語句中指定StorageHandler,並配置STS認證資訊(或開啟雙簽名開關)、JDBC串連地址實現訪問Hologres資料來源。建表語句定義如下。
STS模式建立Hologres外部表格。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>( <col1_name> <data_type>, <col2_name> <data_type>, ...... ) stored BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>' WITH serdeproperties ( 'odps.properties.rolearn'='<ram_arn>') location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', ['odps.federation.jdbc.colmapping'='<col1:column1,col2:column2,col3:column3,...>'] );
雙簽名模式建立Hologres外部表格。
雙簽名Hologres外部表格支援相同RAM使用者可以訪問MaxCompute和Hologres對應有許可權的表,不需要再手工授權。同時支援HologresIP白名單能力,方便您使用。
--開啟雙簽名開關 SET odps.sql.common.table.planner.ext.hive.bridge=true; --建立外部表格 CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>( <col1_name> <data_type>, <col2_name> <data_type>, ...... ) stored BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>' location'<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', ['odps.federation.jdbc.colmapping'='<col1:column1,col2:column2,col3:column3,...>'] );
odps.sql.common.table.planner.ext.hive.bridge:通過雙簽名模式建立Hologres外部表格必填;通過STS模式建立Hologres外部表格不填。雙簽名開關,值設定為
true
,表示開啟雙簽名開關,通過雙簽名模式建立Hologres外部表格。if not exists:可選。如果不指定if not exists選項而存在同名表,會報錯。如果指定if not exists,無論是否存在同名表,即使原表結構與要建立的目標表結構不一致,均返回成功。已存在的同名表的中繼資料資訊不會被改動。
table_name:必填。在MaxCompute上建立的Hologres外部表格的名稱。
col_name:必填。Hologres外部表格的列名稱。
data_type:必填。Hologres外部表格的列的資料類型。
stored by:必填。指定StorageHandler,定義了如何查詢Hologres外部表格。固定取值為
com.aliyun.odps.jdbc.JdbcStorageHandler
,使用JdbcStorageHandler串連方式。ram_arn:通過STS模式建立Hologres外部表格必填;通過雙簽名模式建立Hologres外部表格不填。指定RAM角色的ARN資訊,用於建立外部表格時STS認證資訊的填寫。您可以在RAM存取控制頁面,單擊目標RAM角色名稱後,在基本資料地區擷取。
location:必填。Hologres執行個體的JDBC串連地址。其中:
endpoint:必填。Hologres執行個體的傳統網路網域名稱。擷取方式,請參見執行個體配置。
port:必填。Hologres執行個體的網路連接埠。擷取方式,請參見執行個體配置。
database:必填。串連的Hologres資料庫名稱。更多Hologres資料庫資訊,請參見CREATE DATABASE。
ApplicationName:必填。預設為MaxCompute,無需修改。
schema:可選。如果表名在Hologres資料庫內是唯一的,或源表是預設Schema中的表,可以不配置該屬性。更多Schema資訊,請參見CREATE SCHEMA。
holo_table_name:必填。Hologres源表名稱。更多Hologres源表資訊,請參見CREATE TABLE。
tblproperties:
mcfed.mapreduce.jdbc.driver.class:必填。指定串連Hologres資料庫的驅動程式。固定取值為
org.postgresql.Driver
。odps.federation.jdbc.target.db.type:必填。指定串連的資料庫類型。固定取值為
holo
。odps.federation.jdbc.colmapping:可選。如果需要將指定資料來源的部分列映射至Hologres外部表格,需要配置該參數,指定Hologres源表的欄位和Hologres外部表格欄位的映射關係。
若未配置該參數,按照源表欄位名映射至Hologres外部表格同名列。
若配置該參數,但是只指定MaxCompute外部表格部分列的映射關係,則按照源表欄位名映射至Hologres外部表格同名列,其他未指定的列,列名或類型不符會報錯。
若配置該參數,Hologres裡的欄位名稱存在大寫的情形,需要為Hologres欄位名稱添加雙引號(
""
)。格式為:MaxCompute欄位1 : "Hologres欄位1"[ ,MaxCompute欄位2 : "Hologres欄位2" ,...]
。說明Hologres源表欄位是
c bool, map_B string, a bigint
。MaxCompute外部表格欄位是a bigint, x string, c bool
。colmapping
配置的內容是'x: "map_B"'
,則可以成功映射並查詢Hologres資料。
mcfed.mapreduce.jdbc.input.query:可選。讀取Hologres資料來源表資料。外部表格的列、列名與直接查詢的Hologres資料來源表的列、列名及資料類型保持一致。如果使用了別名,則與別名保持一致。
select_sentence
格式為SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name>
。
建立Hologres外部表格(STS模式)
通過STS模式建立Hologres外部表格的步驟如下:
建立RAM角色
建立RAM角色擷取ARN資訊,用於建立外部表格時填寫STS認證資訊。
登入RAM存取控制建立RAM角色。
建立RAM角色的可信實體類型根據實際需求選擇阿里雲帳號或者身份供應商。
阿里雲帳號:
阿里雲帳號下的RAM使用者可以通過扮演RAM角色來訪問雲資源,詳情請參見建立可信實體為阿里雲帳號的RAM角色。
身份供應商:
通過設定SSO實現從企業本地帳號系統登入至阿里雲控制台,幫您解決企業的統一使用者登入認證要求。詳情請參見建立可信實體為身份供應商的RAM角色。
修改信任策略配置內容。
在角色頁面,單擊已建立完成的RAM角色名稱。
單擊信任策略頁簽。
在信任策略頁簽,單擊編輯信任策略。
參照如下內容修改信任策略配置。
修改信任策略配置內容與選擇的可信實體類型相關。
可信實體類型為阿里雲帳號:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<UID>:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
可信實體類型為身份供應商:
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::<UID>:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
說明<UID>即阿里雲帳號ID,可在使用者資訊頁面擷取。
單擊確定。
添加RAM角色至Hologres執行個體並授權
RAM角色需要有Hologres執行個體的開發許可權,才能在許可權範圍內使用Hologres。由於RAM角色預設沒有Hologres管理主控台的查看和操作執行個體的許可權,因此需要阿里雲帳號完成RAM相關許可權授予才能進行後續操作。添加RAM角色至Hologres執行個體,您可以通過如下方式進行授權。
通過Hologres管理主控台授權。
在左側導覽列單擊執行個體列表,單擊需要授權的Hologres執行個體名稱。
在執行個體詳情頁面,單擊帳號管理。
在使用者管理頁面單擊新增使用者添加RAM角色至Hologres執行個體。
在DB授權頁簽,為該RAM角色授予執行個體的開發許可權。
說明若資料庫的權限原則設定為專家模式,則需在使用者管理頁面將角色類型修改為SuperUser,後續將不再需要進行資料庫授權操作。
通過SQL方式授權。
您可以通過SQL方式進行授權,授權SQL請參見Hologres許可權模型概述。
若是通過RAM使用者扮演RAM角色,RAM使用者預設沒有Hologres管理主控台的許可權,需要阿里雲帳號給RAM使用者在存取控制頁面授予AliyunRAMReadOnlyAccess許可權,否則RAM使用者無法在Hologres管理主控台進行任何操作。詳情請參見文檔授予RAM使用者權限。
建立Hologres外部表格
完成上述步驟後,基於已準備好的資料資訊,您即可登入MaxCompute用戶端,結合建立Hologres外部表格文法建立Hologres外部表格。
安裝並登入MaxCompute本地用戶端,進入目標MaxCompute專案。
進入目標專案命令資訊,請參見專案空間操作。
執行如下命令建立Hologres外部表格。
命令樣本如下。
CREATE EXTERNAL TABLE [IF NOT EXISTS] my_table_holo_jdbc ( id bigint, name string ) stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsholorole') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/mc_test?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=holo/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );
執行如下命令基於建立的Hologres外部表格查詢Hologres源表資訊。
命令樣本如下。
--訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; --查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc limit 10;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 1 | kate | | 2 | mary | | 3 | bob | | 4 | tom | | 5 | lulu | | 6 | mark | | 7 | haward | | 8 | lilei | | 9 | hanmeimei | | 10 | lily | +------------+------------+
可選:基於Hologres外部表格與Hologres進行資料交換、聯合分析。
例如,將MaxCompute加工後的資料利用Hologres外部表格,寫入Hologres實現加速分析、線上服務。命令樣本如下。
--訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; --向Hologres外部表格插入資料。 INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); --查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc;
返回結果如下。
+------------+------------+ | id | name | +------------+------------+ | 12 | alice | | 1 | kate | | 2 | mary | | 3 | bob | | 4 | tom | | 5 | lulu | | 6 | mark | | 7 | haward | | 8 | lilei | | 9 | hanmeimei | | 10 | lily | | 11 | lucy | +------------+------------+
頻繁更新的維度資料表儲存在Hologres,滿足即時動態更新需要。MaxCompute通過外部表格方式訪問維度資料表與MaxCompute中事實表進行關聯分析,命令樣本如下。
--訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; --建立MaxCompute內部表。 CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; --MaxCompute內部表與Hologres外部表格進行關聯分析。 SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id;
返回結果如下。
+------------+------------+------------+------------+ | id | name | id2 | name2 | +------------+------------+------------+------------+ | 1 | kate | 1 | kate | | 2 | mary | 2 | mary | | 3 | bob | 3 | bob | | 4 | tom | 4 | tom | | 5 | lulu | 5 | lulu | | 6 | mark | 6 | mark | | 7 | harward | 7 | harward | | 8 | lilei | 8 | lilei | | 9 | hanmeimei | 9 | hanmeimei | | 10 | lily | 10 | lily | | 11 | lucy | 11 | lucy | | 12 | alice | 12 | alice | +------------+------------+------------+------------+
建立Hologres外部表格(雙簽名模式)
雙簽名是MaxCompute和Hologres共同研發的認證及鑒權協議,在MaxCompute側使用帳號登入資訊加簽名後,把認證資料傳遞給Hologres側,Hologres根據MaxCompute底層達成的協議,進行同名認證及鑒權。這樣只需要在MaxCompute和Hologres有相同的帳號,就可以直接進行外部表格訪問,不需要額外設定認證資訊。
前提條件。
Hologres中存在跟MaxCompute相同名稱的帳號,並且該帳號具有Hologres中對應表的讀寫權限。
使用限制。
僅Hologres V1.3及以上版本支援MaxCompute使用雙簽名模式建立Hologres外部表格,目前雙簽名模式只支援從Hologres外部表格中讀取資料,不支援寫入資料至Hologres外部表格。
命令樣本。
您可直接登入MaxCompute用戶端,結合建立Hologres外部表格文法通過雙簽名模式建立Hologres外部表格。
--建立外部表格 CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string, ds string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgprecn-cn-zvp2o6aq****-cn-beijing-internal.hologres.aliyuncs.com:80/mc_test?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=mf_holo_mc_up/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name,ds:ds' ); --查詢外部表格(必須與開啟雙簽名開關命令一起執行) SET odps.sql.common.table.planner.ext.hive.bridge=true; SELECT * FROM holo_mc_external_dbl;
開啟Hologres外部表格儲存直讀功能
背景介紹
MaxCompute對Hologres外部表格的讀是通過走JDBC模式,目前版本支援MaxCompute直讀Hologres儲存層,能夠帶來以下優勢:
可以大幅降低讀表的延遲,大幅度提高查詢資料的速度。
可以大幅度減少Hologres FE的串連數,大多數Query僅需要一個串連數即可。
使用限制
當開啟Hologres直讀模式時,使用限制如下,在條件不滿足時會回退到JDBC模式。
依賴Hologres執行個體版本 : V1.3.34及以上版本。
Hologres版本低於V1.3.34不支援直讀功能。
由於網路連通性,只支援同Region的MaxCompute訪問Hologres執行個體。
目前不支援跨Region訪問,跨Region訪問會報錯:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3
。不支援直讀Hologres冷存表。
目前直讀功能不支援Hologres行存表。
當Hologres配置為主從架構,僅支援配置串連URL為主執行個體,不支援配置為從執行個體。
直讀功能會對MaxCompute與Hologres之間的列進行類型校正,當出現不匹配的類型時會自動回退為JDBC模式執行。MaxCompute建立Hologres外部表格時,資料類型的限制如下:
JDBC模式與MaxCompute直讀模式都不支援的資料類型:
不支援Array、Map、Struct複雜資料類型。
不支援JSON、MONEY等資料類型。
JDBC模式支援,而MaxCompute直讀模式不支援的資料類型:
BINARY類型。
MaxCompute直讀模式支援,而JDBC模式不支援的資料類型:
JSONB資料類型
MaxCompute直讀模式使用Timestamp類型映射Hologres中的Timestamp With Time Zone類型會存在細微的時間誤差,具體差異如下:
Hologres中Timestamp With Time Zone類型列的時間在
1900-12-31 15:54:15
之前,MaxCompute查詢出來的時間會多5分44秒。Hologres中Timestamp With Time Zone類型列的時間在
1900-12-31 15:54:16
和1969-12-31 23:59:58
之間,MaxCompute查詢出來的時間會多1秒。Hologres中Timestamp With Time Zone類型列的時間在
1969-12-31 23:59:59
之後,MaxCompute查詢出來的時間與Hologres中的無區別。說明MaxCompute直讀模式使用Timestamp類型映射Hologres中的Timestamp With Time Zone類型不僅會存在細微的時間誤差,還會存在時區位移,例如:
以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為
2000-01-01 00:00:00
,MaxCompute查詢出來的時間為2000-01-01 08:00:00
。以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為
1969-01-01 00:00:00
,MaxCompute查詢出來的時間為1969-01-01 08:00:01
。
其他資料類型映射如下:
Hologres資料類型
MaxCompute資料類型
說明
TEXT
STRING
VARCHAR
不涉及
SMALLINT
SMALLINT
不涉及
INT
INT4
INTEGER
INT
不涉及
INT8
BIGINT
BIGINT
不涉及
FLOAT4
REAL
FLOAT
不涉及
FLOAT
FLOAT8
DOUBLE
不涉及
BOOL
BOOLEAN
BOOLEAN
不涉及
TIMESTAMP
TIMESTAMP
儲存精度為微秒,存在時區的時間誤差。
TIMESTAMP WITH TIME ZONE
TIMESTAMP
MaxCompute與Hologres在底層已經進行了精度轉換。MaxCompute輸出不包含時區格式。
NUMERIC
DECIMAL
MaxCompute的DECIMAL如果未指定精度,則預設為
(38,18)
,使用IMPORT FOREIGN SCHEMA
語句建立表時系統會自動轉換精度。CHAR(n)
CHAR(n)
MaxCompute的
CHAR(n)
為固定長度字元類型,n
為長度。最大取值為255。長度不足則使用空格填充。VARCHAR(n)
VARCHAR(n)
MaxCompute的
VARCHAR(n)
為可變長度字元類型,n
為長度。取值範圍為1~65535。DATE
DATE
不涉及
Foreign Server模式存在的額外限制:MaxCompute Project需要開啟三層模型。
開啟方式
在MaxCompute中查詢Hologres外部表格時SQL前加上如下參數。
SET odps.table.api.enable.holo.table=true;
直讀驗證
可以在Logview裡查看日誌,判斷查詢是否走了直讀模式,Logview使用詳情請參見使用Logview 2.0查看作業運行資訊。
在Logview的Summary頁簽下,尋找external holo tables
欄位查看屬性,屬性格式如下:
<project_name>.<table_name>:<訪問方式>[<(回退原因)>]
參數說明:
參數 | 說明 |
project_name | 專案名稱。 |
table_name | 表名稱。 |
訪問方式 | 外部表格的訪問方式,取值如下:
|
回退原因 | 如果訪問方式為
|