Hologres自V3.2版本開始,支援通過DLF訪問Paimon Catalog資料,為使用者提供統一介面,提升中繼資料管理效率。
背景資訊
阿里雲資料湖構建(Data Lake Formation,簡稱DLF)是一款全託管的統一中繼資料和資料存放區及管理平台,為客戶提供中繼資料管理、許可權管理和儲存最佳化等功能。該平台能夠實現中繼資料的統一、湖表格式的統一以及資料存放區的統一,顯著簡化客戶在資料湖構建和管理過程中的營運工作,助力企業聚焦於業務創新和資料洞察。詳情請參見什麼是資料湖構建。
功能詳情
Hologres自
3.2版本開始支援以下功能:通過External Database對接DLF中的Paimon Catalog,詳情請參見EXTERNAL DATABASE。
通過Create/Drop External Schema實現級聯建立/刪除Paimon Catalog中的Database。
通過Create/Drop External Table實現級聯建立/刪除Paimon Catalog中的表。
查看Paimon Catalog中的所有Database和表。
使用Dynamic Table全量、增量讀取Paimon表資料,詳情請參見CREATE DYNAMIC TABLE。
使用ANALYZE、AUTO ANALYZE收集外部表格統計資訊,協助最佳化器產生最佳的查詢計劃,詳情請參見ANALYZE和AUTO ANALYZE。
外部表格資料鏡像。
TimeTravel:基於Timestamp、Version、Tag查詢Paimon表歷史快照。
分支查詢:基於Branch查詢Paimon分支資料及歷史快照。
查詢Paimon系統資料表,如Snapshots、Tags。
Hologres自
4.0版本開始支援豐富的DML操作:多並發寫入Paimon主鍵表,支援
INSERT INTO和INSERT OVERWRITE兩種寫入方式,並最佳化了寫入流程,支援按Bucket進行shuffle後再寫入,以減少小檔案產生。提供基於記憶體的緩衝機制來支援寫入需要緩衝機制的Paimon表,如
Merge Engine為Fisrt Row、通過lookup機制產生Changelog或者開啟了Deletion Vector的表。支援對Paimon表進行
UPDATE、DELETE操作。從 3.2.6 和 4.0.6 版本開始支援讀取 Paimon 已到期的 snapshot 對應的 TAG 的資料。
前提條件
已開通2.5及以上版本的DLF服務並建立Paimon Catalog。詳情請參見授權並開通DLF和資料目錄。
說明支援的地區詳見服務存取點。
已購買Hologres執行個體並開通資料湖加速服務。詳情請參見基於DLF訪問OSS資料湖加速。
使用限制
僅支援訪問同地區的DLF服務。
暫不支援使用HoloWeb中的OSS資料湖加速功能可視化建立DLF Paimon Catalog。
僅External Database方式映射的Paimon外表支援TimeTravel查詢、Branch查詢和資料鏡像能力。
暫不支援對發生Schema Evolution的表執行TimeTravel查詢。
Dynamic Table暫不支援Paimon表和Branch的TimeTravel查詢。
外部表格鏡像暫不支援Paimon主鍵表。
不支援讀取Paimon預設分區資料,如分區值為空白或者NULL的分區。
唯讀從執行個體暫不支援開啟資料湖加速能力。
不支援對外部表格執行
TRUNCATE命令,可使用INSERT OVERWRITE插入空資料代替。不支援寫入Paimon的動態分桶表,即建立Paimon表時未指定
bucket參數或指定了bucket = -1。僅支援對Merge Engine為
deduplicate或partial-update的Paimon主鍵表執行UPDATE操作,且不支援更新主鍵。僅支援對Merge Engine為
deduplicate或partial-update(需開啟partial-update.remove-record-on-delete屬性)的Paimon主鍵表執行DELETE操作。外表不支援DML混合事務,僅在單次DML過程中實現了兩階段交易認可,保證分布式寫入過程的原子性。
使用External Database方式映射Paimon Catalog
建立External Database(SLR模式)
服務關聯角色(SLR)是一種可信實體為阿里雲服務的RAM角色,旨在解決跨雲端服務的授權訪問相關問題。多數情況下,當您使用特定功能時,關聯的雲端服務會自動建立或刪除服務關聯角色,不需要您手動建立或刪除。通過服務關聯角色可以更好地配置雲端服務正常操作所必需的許可權,避免誤操作帶來的風險。詳情請參見服務關聯角色。
適用情境
SLR模式適用於使用目前使用者身份訪問External Database資料的情境,Hologres預設基於SLR和身份透傳實現跨雲產品訪問。
操作步驟
對於新購或升級至Hologres V2.2及以上版本的執行個體,系統會預設建立服務關聯角色,無需手動建立,可跳過該步驟。
說明Hologres V2.2以下版本的執行個體,需存取控制快速授權頁面,建立服務關聯角色。
串連Hologres執行個體並建立External Database。
CREATE EXTERNAL DATABASE EXT_DATABASE_NAME WITH catalog_type 'paimon' metastore_type 'dlf-rest' dlf_catalog 'DLF_CATALOG_NAME' comment 'paimon catalog on dlf' ;查看External Database下的Schema和表。
-- 查詢External Database下的Schema SELECT * FROM hologres.hg_external_schemas('EXT_DATABASE_NAME'); -- 查詢Schema下的表 SELECT * FROM hologres.hg_external_tables ('EXT_DATABASE_NAME', 'EXT_SCHEMA_NAME');查詢表資料。
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;
建立External Database(STS模式)
阿里雲STS(Security Token Service)是阿里雲提供的一種臨時存取權限管理服務。RAM提供RAM使用者和RAM角色兩種身份。其中,RAM角色不具備永久身份憑證,而只能通過STS擷取可以自訂時效和存取權限的臨時身份憑證,即安全性權杖(STS Token),詳情請參見什麼是STS。
適用情境
STS模式適用於跨帳號訪問和Hologres自訂帳號(BASIC帳號)訪問External Database資料的情境。
操作步驟
登入RAM控制台,建立RAM角色,並授予DLF存取權限AliyunDLFFullAccess或AliyunDLFReadOnlyAccess。詳情請參見建立RAM角色並授權。
增加信任策略,允許該RAM角色被可信雲端服務Hologres扮演。詳情請參見修改RAM角色的信任策略。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "hologres.aliyuncs.com" ] } } ], "Version": "1" }登入資料湖構建控制台,在目標Catalog中對RAM角色授予DB和表的存取權限。
在Hologres中建立External Database,認證策略指定上述RAM角色。
CREATE EXTERNAL DATABASE EXT_DATABASE_NAME WITH catalog_type 'paimon' metastore_type 'dlf-rest' dlf_catalog 'paimon_catalog' rolearn 'acs:ram::106380604****:role/***-ramrole' comment 'paimon catalog on dlf' ;在Hologres中建立USER MAPPING,將需要訪問DLF Catalog的RAM使用者或BASIC帳號關聯到RAM角色。
CREATE USER MAPPING FOR "<RAM使用者|BASIC帳號>" EXTERNAL DATABASE EXT_DATABASE_NAME OPTIONS ( rolearn 'acs:ram::10638060***:role/***ramrole' );說明關於USER MAPPING介紹,詳情請參見CREATE USER MAPPING。
關於建立RAM使用者詳情,請參見建立RAM使用者。
關於建立BASIC帳號詳情,請參見使用者管理。
通過RAM使用者登入Hologres管理主控台或BASIC帳號重新串連Hologres執行個體後,執行以下查詢SQL。
SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;
External Database相關操作參見EXTERNAL DATABASE。
External Schema相關操作參見EXTERNAL SCHEMA。
External Table相關操作參見EXTERNAL TABLE。
收集外表統計資訊
Analyze和Auto Analyze命令用於收集資料庫中表內容的統計資訊,最佳化器會根據這些統計資訊產生最佳的查詢計劃,從而提高查詢效率,詳情請參見ANALYZE和AUTO ANALYZE。
-- 更新某個表的統計資訊,預設會收集表中所有列的統計資訊
analyze EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;
-- 更新某個列的統計資訊,會比更新表時採樣的資料更多,更精準,主要用於更新管理條件的列
analyze EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME(COLNAME, COLNAME);
-- 開啟Auto Analyze
ALTER EXTERNAL DATABASE EXT_DATABASE_NAME WITH enable_auto_analyze 'true';TimeTravel查詢
Hologres自V3.2版本開始,支援基於Timestamp、Version、Tag對Paimon表進行歷史Snapshots查詢,從而實現對資料的TimeTravel功能,同時支援在Hologres側查詢Paimon Snapshots、Tags系統資料表,來擷取目標表的Snapshot詳情。關於系統資料表介紹詳情,請參見Paimon System Tables。
查詢Paimon Snapshots系統資料表
SELECT * FROM hologres.hg_list_snapshots('EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;');Snapshots系統資料表包含的欄位資訊與Paimon系統資料表的對應關係如下:
Snapshots系統資料表欄位 | 類型 | 描述 | Paimon系統資料表對應欄位 |
branch_name | TEXT | 分支名稱。 | branch_name |
snapshot_id | TEXT | 快照ID。 | snapshot_id |
schema_id | TEXT | 表Schema ID。 | schema_id |
commit_kind | TEXT | 表資料提交類型。 | commit_kind |
commit_time | TIMESTAMPTZ | 提交時間。 | commit_time |
extend_info | TEXT(JSON) | Paimon Snapshots系統資料表剩餘屬性。 | Paimon Snapshots系統資料表剩餘屬性 |
您也可以通過hologres.hg_list_versions函數來查詢Paimon Snapshots系統資料表,對於Paimon表查詢來說,Version對應Snapshots ID。
SELECT * FROM hologres.hg_list_versions('EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME');查詢Paimon Tag系統資料表
SELECT * FROM hologres.hg_list_tags('EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME');Tag系統資料表包含的欄位資訊與Paimon系統資料表的對應關係如下:
Tag系統資料表欄位 | 類型 | 描述 | Paimon系統資料表對應欄位 |
branch_name | TEXT | 分支名稱。 | branch_name |
tag_name | TEXT | 標籤名稱。 | tag_name |
snapshot_id | TEXT | 快照ID。 | snapshot_id |
schema_id | TEXT | 表Schema ID。 | schema_id |
commit_time | TIMESTAMPTZ | 提交時間。 | commit_time |
extend_info | TEXT(JSON) | Paimon Tag系統資料表剩餘屬性。 | Paimon Tag系統資料表剩餘屬性 |
基於Timestamp查詢Paimon歷史快照
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR TIMESTAMP AS OF 'TIMESTAMP';基於Version查詢Paimon歷史快照
對於Paimon表來說,Version對應Snapshots ID。
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR VERSION AS OF 'VERSION';基於Tag查詢Paimon歷史快照
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR TAG AS OF 'TAG';Branch查詢
Hologres自V3.2.版本開始,支援基於Branch查詢Paimon表指定分支資料,並支援分支Fallback屬性,更多關於Paimon Branch介紹詳情,請參見Manage Branch。
查詢Branch系統資料表
SELECT * FROM hologres.hg_list_branches('EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME');Branch系統資料表包含的欄位資訊與Paimon系統資料表的對應關係如下:
欄位 | 類型 | 描述 | Paimon系統資料表對應欄位 |
branch_name | TEXT | 分支名稱。 | branch_name |
create_time | TIMESTAMPTZ | 分支建立時間。 | create_time |
extend_info | TEXT(JSON) | Paimon Branch系統資料表剩餘屬性。 | Paimon Branch系統資料表剩餘屬性 |
查詢指定分支資料
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR branch AS OF 'TAG';如果Paimon表設定了scan.fallback-branch屬性,查詢作業從當前分支讀取資料時,某個分區不存在,讀取器會嘗試從備用分支(Fallback Branch)讀取該分區的資料。更多關於Fallback Branch介紹詳情,請參見Manage Branch。
查詢指定分支的歷史Snapshots資料
-- 基於Timestamp查詢
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR branch AS OF 'BRANCH_NAME' TIMESTAMP AS OF 'TIMESTAMP';
-- 基於Tag查詢
SELECT * FROM 'EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME' FOR branch AS OF 'BRANCH_NAME' TAG AS OF 'TAG_NAME';湖表鏡像加速
Hologres自V3.2版本起,新增湖表鏡像功能,以加速湖上資料查詢。該功能支援中繼資料與資料鏡像,能夠近即時或按指定時間間隔將外部資料源的變更同步至Hologres。此外,還支援全表鏡像和分區表的部分鏡像,可通過參數靈活控制鏡像資料的範圍。更多介紹詳情,請參見湖表鏡像。
使用Foreign Table方式消費Paimon表
建立Foreign Server。
關於Foreign Server的更多操作詳情,請參見Foreign Server更多操作(SQL方式)。
DLF文法
說明適用於 2.5 及以上版本的 DLF 服務
SQL文法如下:
-- create foreign server CREATE SERVER IF NOT EXISTS SERVER_NAME FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( catalog_type 'paimon', metastore_type 'dlf-rest', dlf_catalog 'DLF_CATALOG_NAME' );DLF1.0文法
說明適用於 1.0 版本的 DLF 服務。
SQL文法如下:
-- create foreign server CREATE SERVER IF NOT EXISTS SERVER_NAME FOREIGN DATA WRAPPER dlf_fdw OPTIONS ( dlf_region '', dlf_endpoint 'dlf-share..aliyuncs.com', oss_endpoint 'oss-REGION_ID-internal.aliyuncs.com', dlf_catalog 'dlf_catalog_name' );建立外部表格。
IMPORT FOREIGN SCHEMA方式
關於IMPORT FOREIGN SCHEMA使用詳情,請參見IMPORT FOREIGN SCHEMA。
使用IMPORT FOREIGN SCHEMA建立外表
-- 使用import foreign schema建立外表 IMPORT FOREIGN SCHEMA DLF_DB_NAME FROM SERVER SERVER_NAME INTO <holo+schema_name> options (if_table_exist 'update');指定表名建立外表
IMPORT FOREIGN SCHEMA DLF_DB_NAME limit to (table_name[,....]) FROM SERVER SERVER_NAME into <holo+schema_name> options (if_table_exist 'update');
CREATE FOREIGN TABLE方式
關於CREATE FOREIGN TABLE使用詳情,請參見CREATE FOREIGN TABLE。
CREATE FOREIGN TABLE FOREIGN_TABLE_NAME ( { column_name data_type } [, ... ] ) SERVER SERVER_NAME options ( schema_name 'DLF_DB_NAME', table_name 'DLF_TABLE_NAME' );
使用Dynamic Table消費Paimon表
Dynamic Table可以自動處理並儲存一個或者多個基表(Base Table)對象的資料彙總結果,內建不同的資料重新整理策略,業務可以根據需求設定不同的資料重新整理策略,實現資料從基表對象到Dynamic Table的自動流轉,滿足業務統一開發、資料自動流轉、處理時效性等訴求。Hologres自V3.0版本開始,支援把MaxCompute外部表格和DLF外部表格作為Dynamic Table的基表,詳見Dynamic Table。
全量重新整理
CREATE DYNAMIC TABLE paimon_dt_table
WITH (
auto_refresh_mode='full',
freshness='3 minutes'
)AS SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;增量重新整理
CREATE DYNAMIC TABLE paimon_dt_table_increamental
WITH (
auto_refresh_mode='incremental',
freshness='3 minutes'
)AS SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;自動重新整理
CREATE DYNAMIC TABLE paimon_dt_table_auto
WITH (
auto_refresh_mode='auto',
freshness='3 minutes'
)AS SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;DML操作
INSERT INTO
-- 使用Hologres SQL建立Paimon主鍵表並插入資料
CREATE EXTERNAL TABLE EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME (
id BIGINT,
customer_id BIGINT,
item TEXT,
amount FLOAT,
dt TEXT,
PRIMARY KEY (id)
)
WITH (
"table_format" = 'paimon',
"file_format" = 'orc',
"merge-engine" = 'deduplicate', -- 合并策略樣本,可按需修改
"bucket" = '4' -- 樣本 bucket 數
);
INSERT INTO EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME (id, customer_id, item, amount, dt) VALUES
(1, 1001, 'apple', 3.50, '2025-09-10'),
(2, 1002, 'banana', 2.00, '2025-09-10'),
(3, 1003, 'orange', 4.20, '2025-09-11');INSERT OVERWRITE
-- 使用Hologres SQL建立Paimon Append Table並插入資料
CREATE EXTERNAL TABLE EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME (
id BIGINT,
name TEXT,
amount FLOAT8,
dt TEXT
)
LOGICAL PARTITION BY LIST(dt)
WITH (
"table_format" = 'paimon',
"file_format" = 'parquet',
"merge-engine" = 'deduplicate',
"bucket-key" = 'id',
"bucket" = '2'
);
INSERT OVERWRITE EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME(id, name, amount, dt) VALUES
(1, 'Alice', 100.50, '2025-09-01'),
(2, 'Bob', 200.00, '2025-09-01'),
(3, 'Carol', 150.75, '2025-09-02');UPDATE
UPDATE EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME SET amount= 5 where id= 1;DELETE
DELETE FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME WHERE id = 2;