本文介紹如何建立Hologres外部表格,以及如何在外部表格建表語句中指定Hologres資料來源、STS認證資訊或開啟雙簽名開關、映射目標表、JDBC驅動資訊。
功能介紹
Hologres是相容PostgreSQL協議的即時互動式分析資料倉庫,在底層與MaxCompute無縫串連。通過在MaxCompute上建立Hologres外部表格,可以實現基於PostgreSQL JDBC驅動及STS認證資訊查詢Hologres資料來源的資料。該方式無冗餘儲存,無需匯入匯出資料,可實現快速擷取查詢結果。
適用範圍
資料操作(DML)
MaxCompute不支援對建立的Hologres外部表格執行更新(UPDATE)、刪除(DELETE)操作。
不支援對Hologres外部表格執行INSERT OVERWRITE操作:
從Hologres側讀取Hologres映射MaxCompute的外表,通過Hologres的INSERT OVERWRITE語義完成從MaxCompute到Hologres的資料覆蓋寫入,詳情請參見INSERT OVERWRITE。
資料寫入風險
當向Hologres外部表格寫入大量資料時,由於採用並行多進程寫入,會存在小機率某個寫入進程資料重寫的情況,從而導致資料重複。
分區
Hologres的分區表和MaxCompute的分區表沒有對應關係。Hologres外部表格不支援分區,但直讀模式下,查詢MaxCompute的Hologres外部表格映射Hologres的分區父表時,查詢條件匹配分區子表的分區列,可以進行分區裁剪。
Hologres外部表格不支援cluster屬性。
Hologres外部表格不支援映射Hologres的Dynamic Table。
建立Hologres外部表格
可以通過如下兩種方式建立Hologres外部表格:RAM普通角色授權模式(STS模式)和服務關聯角色授權模式(雙簽名模式)。
注意事項
外部表格建立規範
如果Hologres開啟了外部存取IP白名單,請按需升級Hologres版本:
RAM普通角色授權模式下升級Hologres至3.2及以上版本
或服務關聯角色授權模式下升級Hologres至2.0.28及以上版本
Hologres才可根據MaxCompute服務身份和服務關聯角色身份信任MaxCompute節點IP,無需為MaxCompute彈性節點在Hologres的外部存取IP白名單中新增允許存取配置。
對於Hologres的父表、子表,Hologres外部表格中會指定表名,並執行SQL語句。父表、子表都可以映射至Hologres外部表格,但是父表只能讀不能寫。
向Hologres外部表格寫入資料時,暫不支援Hologres的INSERT ON CONFLICT(UPSERT)機制。如果Hologres源表有主鍵,請避免寫入的資料與Hologres源表中的資料產生主鍵唯一性衝突。
表名和欄位名大小寫不敏感,且在建立表、查詢表及欄位時不支援強制轉換大小寫。
Schema相容性
當Hologres源表中的Schema與外表Schema不一致時:
列數不一致:如果Hologres源表中的列數小於外表DDL的列數,則讀取RDS資料時,系統會報錯。例如
column "xxx" does not exist。當Hologres源表中的列數大於外表DDL的列數時,系統會丟棄超出的列資料。列類型不一致:MaxCompute不支援使用INT類型接收Hologres源表中的STRING類型資料,支援使用STRING類型接收INT類型資料(不推薦)。
文法說明
在建立外部表格時,需要在建表DDL語句中指定StorageHandler,並配置STS認證資訊(或開啟服務關聯角色授權模式開關)、JDBC串連地址,以實現訪問Hologres資料來源。
RAM普通角色授權模式建立Hologres外部表格
具體使用範例程式碼,詳情請參見建立Hologres外部表格(RAM普通角色授權模式)。
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'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);服務關聯角色授權模式建立Hologres外部表格
具體使用範例程式碼,詳情請參見建立Hologres外部表格(服務關聯角色授權模式)。
服務關聯角色授權模式建立Hologres外部表格支援相同RAM使用者可以訪問MaxCompute和Hologres對應有許可權的表,不需要再手動授權。同時支援HologresIP白名單能力,便於使用。
-- 建立外部表格
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'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);參數說明
使用樣本
步驟一:準備Hologres資料
如果已有Hologres資料庫、Hologres表及測試資料,可忽略該步驟。
建立Hologres資料庫
登入Hologres管理主控台,在左上方選擇地區。
在左側導覽列選擇實例清單。
若沒有執行個體,需要先購買Hologres執行個體。
在實例清單頁面,單擊目標執行個體名稱。
在執行個體詳情頁面,單擊登入執行個體。
單擊上方元数据管理頁簽。
單擊新建數據庫,在彈出的對話方塊中,填寫數據庫名稱,其他參數保持預設。
建立Hologres表
在執行個體詳情頁面,單擊登入執行個體。
單擊上方Sql編輯器頁簽。
輸入如下語句
CREATE TABLE IF NOT EXISTS holo ( id INT PRIMARY KEY, name TEXT ); INSERT INTO holo (id, name) VALUES (1, 'kate'), (2, 'mary'), (3, 'bob'), (4, 'tom'), (5, 'lulu'), (6, 'mark'), (7, 'haward'), (8, 'lilei'), (9, 'hanmeimei'), (10, 'lily'), (11, 'lucy'); SELECT * FROM holo ORDER BY id;
步驟二:建立Hologres外部表格
建立Hologres外部表格(RAM普通角色授權模式)
此模式下,外部表格建立者將具有Hologres資料存取權限的RAM Role整合到Hologres外部表格中,並根據需要將該外部表格的許可權授予MaxCompute中的其他使用者。使用者訪問該外部表格時,使用綁定的RAM Role許可權訪問所映射的Hologres表資料。
Hologres不支援將跨主帳號的RAM Role添加至資料庫執行個體,因此Hologres的STS模式下普通角色授權僅支援同帳號的RAM Role。相應地,MaxCompute通過外部表格或外部Schema訪問Hologres時,也僅支援同帳號的RAM Role。
前置準備
已準備好待建立Hologres外部表格的目標MaxCompute專案。
建立MaxCompute專案資訊,請參見建立MaxCompute專案。
RAM角色建立及授權,請參見Hologres的RAM普通角色授權。
在MaxCompute中建立外部表格
登入MaxCompute用戶端,進入目標MaxCompute專案。
執行如下命令建立Hologres外部表格。
按照步驟一:準備Hologres資料步驟,準備好的Hologres執行個體資訊如下:
Hologres資料庫名稱:
holo_external_test。Hologres資料庫的Schema:
public。Hologres表名稱:
holo。Hologres資料庫傳統網路串連地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
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/<role name>') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' 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; SET odps.table.api.enable.holo.table=true; --開啟JDBC直讀方式 -- 查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc limit 10; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+基於Hologres外部表格與Hologres進行資料交換、聯合分析。
將MaxCompute加工後的資料利用Hologres外部表格,寫入Hologres實現加速分析、線上服務。命令樣本如下。
-- 訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --開啟JDBC直讀方式 -- 向Hologres外部表格插入資料。 INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- 查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+頻繁更新的維度資料表儲存在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 | +------------+------------+------------+------------+ | 9 | hanmeimei | 9 | hanmeimei | | 4 | tom | 4 | tom | | 7 | haward | 7 | haward | | 2 | mary | 2 | mary | | 5 | lulu | 5 | lulu | | 12 | alice | 12 | alice | | 8 | lilei | 8 | lilei | | 10 | lily | 10 | lily | | 1 | kate | 1 | kate | | 11 | lucy | 11 | lucy | | 6 | mark | 6 | mark | | 3 | bob | 3 | bob | +------------+------------+------------+------------+
建立Hologres外部表格(服務關聯角色授權模式)
此模式下,使用者需要建立服務關聯角色以打通Hologres的資料存取權限。為防止越權訪問,此模式在訪問時會透傳使用者身份到Hologres進行鑒權,因此使用者需要同時具備外部表格的許可權和外部表格所映射的Hologres表的許可權。
前置準備
已準備好待建立Hologres外部表格的目標MaxCompute專案。
建立MaxCompute專案資訊,請參見建立MaxCompute專案。
Hologres中存在跟MaxCompute相同名稱的帳號,並且該帳號具有Hologres中對應表的讀寫權限。
僅Hologres V1.3及以上版本支援MaxCompute使用雙簽名模式建立Hologres外部表格,目前雙簽名模式只支援從Hologres外部表格中讀取資料,不支援寫入資料至Hologres外部表格。
在MaxCompute中建立外部表格
登入MaxCompute用戶端,進入目標MaxCompute專案。
執行如下命令建立Hologres外部表格。
按照步驟一:準備Hologres資料步驟,準備好的Hologres執行個體資訊如下:
Hologres資料庫名稱:
holo_external_test。Hologres資料庫的Schema:
public。Hologres表名稱:
holo。Hologres資料庫傳統網路串連地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
-- 建立外部表格 CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );查詢外部表格
SELECT * FROM holo_mc_external_dbl; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+
開啟Hologres外部表格儲存直讀功能
MaxCompute對Hologres外部表格的讀通過JDBC模式實現,目前版本支援MaxCompute直讀Hologres儲存層,能夠帶來以下優勢:
可以大幅降低讀表的延遲,顯著提高查詢資料的速度。
可以大幅度減少Hologres FE的串連數,大多數Query僅需要一個串連數。
使用限制
當開啟Hologres直讀模式時,使用限制如下,在條件不滿足時會回退到JDBC模式。
版本要求
Hologres執行個體版本必須為V1.3.34及以上。低於V1.3.34的版本不支援直讀功能。
表類型限制
不支援直讀Hologres冷存表。
不支援直讀Hologres行存表。
資料類型映射限制
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的時區為東八區為例,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。
同Region限制
由於網路連通性限制,只支援同Region的MaxCompute訪問Hologres執行個體。跨Region訪問會報錯:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3。當Hologres配置為主從架構,僅支援配置串連URL為主執行個體,不支援配置為從執行個體。
Foreign Server模式存在的額外限制:MaxCompute專案需要開啟Schema級文法開關。
開啟方式
在MaxCompute中查詢Hologres外部表格時SQL前加上如下參數。
SET odps.table.api.enable.holo.table=true;設定專案粒度直讀開關。
-- 開啟直讀開關和直讀時關閉回退成jdbc 都可以設定為專案粒度。
-- 專案粒度開啟直讀開關:
setproject odps.table.api.enable.holo.table=true; --true開啟|false關閉
-- 關閉預設回退JDBC的開關:
setproject odps.table.api.allow.fallback.jdbc=false; --true回退|false不回退直讀驗證
可以在Logview裡查看日誌,判斷查詢是否走了直讀模式,Logview使用詳情請參見使用Logview 2.0查看作業運行資訊。
在Logview的Summary頁簽下,尋找external holo tables欄位查看屬性,屬性格式如下:
<project_name>.<table_name>:<訪問方式>[<(回退原因)>]參數說明:
參數 | 說明 |
project_name | 專案名稱。 |
table_name | 表名稱。 |
訪問方式 | 外部表格的訪問方式,取值如下:
|
回退原因 | 如果訪問方式為
|
開啟了直讀模式啟動並執行任務,偶然觸發直讀限制情境,任務會回退成JDBC模式。如果直讀時業務負載比較大,回退成JDBC模式會佔用大量的Hologres串連池資源,且JDBC方式資料轉送效率遠低於直讀,佔用資源釋放也會比較慢。
需要關注直讀回退成JDBC方式後,會對Hologres執行個體造成負載壓力,極端情況下會因為大量回退的作業影響其他業務訪問Hologres執行個體。為了預防這種情況,可以提前通過在直讀任務中增加運行參數set odps.table.api.allow.fallback.jdbc=false;關閉自動回退,避免非預期影響。
Hologres外部表格謂詞下推
MaxCompute在訪問 Hologres 外部表格時, 支援將查詢過濾條件下推到 Hologres 側執行(謂詞下推/Predicate Pushdown),在Hologres 側提前過濾資料,減少資料轉送量,提升查詢效能。主要適用如下情境:
帶有選擇性過濾條件的查詢(過濾掉大量資料)。
邏輯分區表查詢。
使用說明
情境 | Holo 直讀情境下支援 PPD |
核心參數 |
參數文法格式樣本:
|
支援類型 | INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY |
使用限制 |
|
適用情境 |
|
使用樣本
資料準備。在Hologres執行個體中建立測試表並插入資料。
CREATE TABLE test_multi_type_ppd ( c_id INT NOT NULL, c_boolean BOOLEAN, c_int INT, c_bigint BIGINT, c_double DOUBLE precision, c_float REAL, c_string TEXT, c_date DATE, c_timestamp_tz TIMESTAMPTZ, c_timestamp_ntz TIMESTAMP ) WITH (SEGMENT_KEY = 'c_id'); -- 插入 10 條資料 INSERT INTO test_multi_type_ppd VALUES (1, true, 10, 1000, 1.25, 1.5, 'alpha', '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'), (2, false, 20, 2000, -2.50, 2.5, 'beta', '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'), (3, true, 30, 3000, 3.75, -3.5, 'gamma', '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'), (4, false, 40, 4000, 4.00, 4.5, 'delta', '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'), (5, true, 50, 5000, 5.50, 5.5, 'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'), (6, false, 60, 6000, 6.60, 6.0, 'zeta', '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'), (7, true, 70, 7000, 7.70, -7.0, 'eta', '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'), (8, false, 80, 8000, 8.80, 8.0, 'theta', '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'), (9, true, 90, 9000, -9.90, 9.0, 'iota', '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'), (10, false, 100, 10000, 10.10, 10.0, 'kappa', '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00'); SELECT * FROM test_multi_type_ppd;在MaxCompute中建立Hologres外部表格。
CREATE EXTERNAL TABLE test_multi_type_ppd ( c_id int, c_boolean boolean, c_int int, c_bigint bigint, c_double double, c_float float, c_string string, c_date date, c_timestamp_tz timestamp, c_timestamp_ntz timestamp_ntz ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' LOCATION 'jdbc:postgresql://<holo-endpoint>/<db>?currentSchema=public&table=test_multi_type_ppd' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo' );查詢外部表格資料。
-- 啟用 Holo 直讀 SET odps.table.api.enable.holo.table=true; -- 設定 PPD 模式(off/on/debug) SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}"; -- 類型系統設定 SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; -- 允許運算式下推到 TableScan,一般情況下,預設是開啟的 SET odps.use.builtin.function.input.range=true; -- set odps.mcqa.disable=true; SELECT * FROM test_multi_type_ppd WHERE c_id = 3; -- 返回結果如下。 +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ | c_id | c_boolean | c_int | c_bigint | c_double | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz | +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ | 3 | true | 30 | 3000 | 3.75 | -3.5 | gamma | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 | +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ -- 查看log view中Summary明細,會出現如下提示 external holo tables: **.default.test_multi_type_ppd:Optimized Holo-side PPD enabled --> Filter pushdown applied successfully Snapshot Id: 56-1-100*** With-filter file count: 2 With-filter create snapshot duration: 19ms
Hologres資料匯入匯出
支援資料類型
DECIMAL類型限制:
在MaxCompute中建立的Hologres外部表格,
DECIMAL資料類型預設且固定為decimal(38,18),不能修改。如果源表小數位元較少,可以在MaxCompute外部表格中將該列定義為STRING類型,在使用時再通過CAST函數強制轉換。複雜類型限制:
MaxCompute建立的Hologres外部表格,不支援
Array,Map,Struct等複雜資料類型。其他不相容類型:
Hologres中的
MONEY等資料類型,目前在MaxCompute中沒有對應的資料類型,暫時不支援。
詳情如下表所示:
Hologres資料類型 | MaxCompute資料類型 | JDBC讀 | JDBC寫 | 直讀(odps.table.api.enable.holo.table=true) | 說明 |
INTEGER(別名INT或INT4) | INT | 32位有符號整型。 | |||
TEXT | STRING、VARCHAR | 字串類型,目前長度限制為8 MB。 | |||
SMALLINT | SMALLINT | 16位有符號整型。 | |||
INT2 | SMALLINT | 16位有符號整型。 | |||
BIGINT(別名INT8) | BIGINT | 64位有符號整型。 | |||
BYTEA | BINARY | 位元據類型,目前長度限制為8 MB。Hologres的 | |||
REAL(別名FLOAT4) | FLOAT | 32位二進位浮點型。 | |||
DOUBLE PRECISION(別名FLOAT8) | DOUBLE | 64位二進位浮點型。 | |||
BOOLEAN(別名BOOL) | BOOLEAN | BOOLEAN類型。 | |||
TIMESTAMP | TIMESTAMP_NTZ | 儲存精度為納秒,存在時區的時間誤差。 Hologres的TIMESTAMP類型不包含時區,儲存精度為微秒。 | |||
TIMESTAMP WITH TIME ZONE(別名TIMESTAMPTZ) | TIMESTAMP | 時間戳記類型,精確到納秒,格式為 MaxCompute與Hologres在底層已經進行了精度轉換。MaxCompute輸出不包含時區格式。 | |||
DECIMAL(別名NUMERIC) | DECIMAL(precision,scale) | 10進位精確數字類型。
MaxCompute的DECIMAL如果未指定精度,則預設為 | |||
CHAR(n) | CHAR(n) | MaxCompute的 Hologres的 | |||
VARCHAR(n) | VARCHAR(n) | MaxCompute的 Hologres的 | |||
DATE | DATE | 日期類型,格式為 | |||
INT4[] | ARRAY<INT> | 複雜類型ARRAY。 | |||
INT8[] | ARRAY<BIGINT> | ||||
FLOAT4[] | ARRAY<FLOAT> | ||||
FLOAT8[] | ARRAY<DOUBLE> | ||||
BOOLEAN[] | ARRAY<BOOLEAN> | ||||
TEXT[] | ARRAY<STRING> | ||||
JSONB | JSON | 複雜類型 JSON,直讀模式支援。 | |||
JSON | STRING | 字串類型,目前長度限制為8 MB。JDBC模式支援Hologres的JSON類型。 | |||
SERIAL(自增序列) | INT | Hologres的自增序欄欄位,MaxCompute可用INT類型接收,但寫入時無法實現自增功能。 | |||
RoaringBitmap | 不支援 | MaxCompute側沒有映射的類型。 | |||
RoaringBitmap64 | 不支援 | MaxCompute側沒有映射的類型。 | |||
BIT(n) | 不支援 | MaxCompute側沒有映射的類型。 | |||
VARBIT(n) | 不支援 | MaxCompute側沒有映射的類型。 | |||
INTERVAL | 不支援 | MaxCompute側沒有映射的類型。 | |||
TIMETZ | 不支援 | MaxCompute側沒有映射的類型。 | |||
TIME | 不支援 | MaxCompute側沒有映射的類型。 | |||
INET | 不支援 | MaxCompute側沒有映射的類型。 | |||
MONEY | 不支援 | MaxCompute側沒有映射的類型。 | |||
OID | 不支援 | MaxCompute側沒有映射的類型。 | |||
UUID | 不支援 | MaxCompute側沒有映射的類型。 |
常見問題
通過MaxCompute直讀Hologres資料時,報錯ODPS-0130071,如何解決?
問題現象
直讀Hologres資料時,報錯
ODPS-0130071 Failed to split to equal size...max count: 7777。例如:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777產生原因
MaxCompute直讀Hologres中的資料時,按照預設的拆分Mapper策略(輸入資料量/split.size 256MB),導致任務產生的Mapper並發數超過了最大限制數7777。
說明該限制是防止使用者直接提交產生大量Mapper任務,從而對Hologres檔案或網路連接的穩定性產生影響。
解決措施
您可以通過設定以下參數,解決報錯問題。
SET odps.external.holo.mapper.instances=10000; -- 提高並發上限,最高不超過10000。 SET odps.sql.mapper.split.size=512; -- 調整任務並發數,最高不超過512M
基於Hologres外部表格執行SQL作業時,運行慢,如何解決?
使用SDK搜尋MaxCompute外部表格資料速度慢。
問題現象
使用SDK搜尋MaxCompute外部表格資料速度慢。
解決措施
外部表格僅支援全量搜尋,所以較慢,建議您改用MaxCompute內部表。
當Hologres側使用關鍵字作為列名時報錯,如何解決?
問題現象
當Hologres側使用關鍵字作為列名,如果不加特殊配置,會出現如下報錯:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","解決措施
添加參數映射Hologres源表和Hologres外部表格欄位關係:
odps.federation.jdbc.colmapping。例如:Hologres源表包含關鍵字欄位
"offset",則建立Hologres外部表格時需要添加參數為'odps.federation.jdbc.colmapping'='offset:"offset"'。
當通過雙簽名模式讀取外部表格時,報錯password authentication failed for user "mcslr$STS.******",如何解決?
問題現象
當子帳號或RamRole使用者通過服務關聯角色授權模式(雙簽名模式)讀取Hologres外表時,報錯
password authentication failed for user "mcslr$STS.******",詳情如下:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: splitByCommonTable() failed, dataSourceId=[TableScan1], tableId=[*****.*****], location=[jdbc:postgresql://hgpostcn-cn-*****-cn-beijing-internal.hologres.aliyuncs.com:80/*****?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=*****/], rootCause -> common/table/jni/utils/jni_helper.cpp(126): UnretryableException: Common table io jni exception - ExceptionType: com.aliyun.odps.hive.wrapper.thrift.RequestException Message: null StackTrace: RequestException(reason:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "mcslr$STS.*********"解決措施
報錯顯示目前使用者沒有Hologres側的讀表許可權,需要主帳號或管理員帳號登入Hologres控制台,進入資訊安全中心,添加當前報錯使用者到使用者管理並進行DB授權操作。
直讀模式使用ppd報錯Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo
報錯資訊
Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo, errorMsg[storage/table/src/holo/snapshot.cpp(319): StorageException: Create/Get snapshot failed for table: test_multi_type_ppd partition: Query:select holo_create_table_snapshot('public.test_multi_type_ppd', 259200, filter=>$$c_id = 3$$) with error ERROR: internal error: Failed to build fragment dag desc: node type 65 is not supported解決措施
請排查Hologres內表是否符合使用說明中的要求。
相關文檔
Hologres外部表格常見問題詳情,請參見湖倉一體/外部表格常見問題。