全部产品
Search
文档中心

实时数仓Hologres:基于DLF访问Paimon Catalog

更新时间:Dec 30, 2025

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 INTOINSERT OVERWRITE两种写入方式,并优化了写入流程,支持按Bucket进行shuffle后再写入,以减少小文件产生。

    • 提供基于内存的缓存机制来支持写入需要缓存机制的Paimon表,如Merge EngineFisrt Row、通过lookup机制生成Changelog或者开启了Deletion Vector的表。

    • 支持对Paimon表进行UPDATEDELETE操作。

    • 从 3.2.6 和 4.0.6 版本开始支持读取 Paimon 已过期的 snapshot 对应的 TAG 的数据。

前提条件

使用限制

  • 仅支持访问同地域的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为deduplicatepartial-update的Paimon主键表执行UPDATE操作,且不支持更新主键。

  • 仅支持对Merge Engine为deduplicatepartial-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和身份透传实现跨云产品访问。

操作步骤

  1. 对于新购或升级至Hologres V2.2及以上版本的实例,系统会默认创建服务关联角色,无需手动创建,可跳过该步骤。

    说明

    Hologres V2.2以下版本的实例,需访问控制快速授权页面,创建服务关联角色。

  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'
      ;
  3. 查看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');
  4. 查询表数据。

    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数据的场景。

操作步骤

  1. 登录RAM控制台,创建RAM角色,并授予DLF访问权限AliyunDLFFullAccess或AliyunDLFReadOnlyAccess。详情请参见创建RAM角色并授权

  2. 增加信任策略,允许该RAM角色被可信云服务Hologres扮演。详情请参见修改RAM角色的信任策略

    {
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "hologres.aliyuncs.com"
            ]
          }
        }
      ],
      "Version": "1"
    }
  3. 登录数据湖构建控制台,在目标Catalog中对RAM角色授予DB和表的访问权限。

  4. 在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'
      ;
  5. 在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'
    );
    说明
  6. 通过RAM用户登录Hologres管理控制台或BASIC账号重新连接Hologres实例后,执行以下查询SQL。

    SELECT * FROM EXT_DATABASE_NAME.EXT_SCHEMA_NAME.EXT_TABLE_NAME;

收集外表统计信息

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表

  1. 创建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'                 
    );
  2. 创建外部表。

    • 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;