全部產品
Search
文件中心

E-MapReduce:Iceberg Catalog

更新時間:Nov 27, 2025

Iceberg Catalog是一種External Catalog,StarRocks從2.4版本開始支援。

背景資訊

通過Iceberg Catalog,您可以:

  • 無需手動建表,通過Iceberg Catalog直接查詢Iceberg內的資料。

  • 通過INSERT INTO或非同步物化視圖(2.5版本及以上)將Iceberg內的資料進行加工建模,並匯入至StarRocks。

  • 在StarRocks側建立或刪除Iceberg庫表,或通過INSERT INTO將StarRocks表資料寫入到Parquet格式的Iceberg表中(3.1版本及以上)。

為保證正常訪問Iceberg內的資料,StarRocks叢集必須能夠訪問Iceberg叢集的儲存系統和中繼資料服務。目前StarRocks支援以下儲存系統和中繼資料服務:

  • Distributed File System(HDFS)或阿里雲Object Storage Service。

  • 中繼資料服務。當前支援的中繼資料服務包括Hive Metastore(以下簡稱HMS)、資料湖構建DLF 1.0(舊版)

使用說明

StarRocks查詢Iceberg資料時,注意以下幾點。

檔案格式

壓縮格式

Iceberg表版本

Parquet

SNAPPY、LZ4、ZSTD、GZIP和NO_COMPRESSION

  • v1表:支援。

  • v2表:自StarRocks 3.1版本起支援position-delete,自3.1.10+、3.2.5+、3.3版本起支援equality-delete。

ORC

ZLIB、SNAPPY、LZO、LZ4、ZSTD和NO_COMPRESSION

  • v1表:支援。

  • v2表:自StarRocks 3.0版本起支援position-delete,自3.1.8+、3.2.3+、3.3版本起支援equality-delete。

建立Iceberg Catalog

文法

CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
    "type" = "iceberg",
    MetastoreParams
)

參數說明

Iceberg使用的中繼資料服務不同,參數的配置也不同。

使用HMS

  • catalog_name:Iceberg Catalog的名稱,必選參數。命名要求如下:

    • 必須由字母(a~z或A~Z)、數字(0~9)或底線(_)組成,並且只能以字母開頭。

    • 總長度不能超過64個字元。

    • Catalog名稱大小寫敏感。

  • comment:Iceberg Catalog的描述,此參數為可選。

  • type:資料來源的類型,設定為iceberg

  • MetastoreParams:StarRocks訪問Iceberg叢集中繼資料服務的相關參數配置。

    屬性

    說明

    iceberg.catalog.type

    Iceberg中Catalog的類型,取值為hive

    hive.metastore.uris

    Hive MetaStore的URI。格式為thrift://<Hive MetaStore的IP地址>:<連接埠號碼>,連接埠號碼預設為9083。

使用DLF 1.0(舊版)

  • catalog_name:Iceberg Catalog的名稱,必選參數。命名要求如下:

    • 必須由字母(a~z或A~Z)、數字(0~9)或底線(_)組成,並且只能以字母開頭。

    • 總長度不能超過64個字元。

    • Catalog名稱大小寫敏感。

  • comment:Iceberg Catalog的描述,此參數為可選。

  • type:資料來源的類型,設定為iceberg

  • MetastoreParams:StarRocks訪問Iceberg叢集中繼資料服務的相關參數配置。

    屬性

    說明

    iceberg.catalog.type

    Iceberg中Catalog的類型,取值為dlf

    dlf.catalog.id

    DLF中已有的資料目錄ID。如果未配置dlf.catalog.id參數的值,則系統將使用預設的DLF Catalog。

使用DLF

重要

如果使用DLF,則必須使用已配置好的RAM使用者串連StarRocks Manager進行相應的操作,詳情請參見使用DLF Catalog

  • catalog_name:Iceberg Catalog的名稱,必選參數。命名要求如下:

    • 必須由字母(a~z或A~Z)、數字(0~9)或底線(_)組成,並且只能以字母開頭。

    • 總長度不能超過64個字元。

  • comment:Iceberg Catalog的描述。此參數為可選。

  • type:資料來源的類型。設定為iceberg

  • CatalogParams:StarRocks訪問Iceberg叢集中繼資料的相關參數配置。Iceberg叢集使用的中繼資料類型不同,參數的配置也不同。

    參數

    是否必須

    說明

    <catalog_name>

    DLF資料目錄(Catalog)的名稱,例如,dlf_catalog

    type

    Catalog類型,Iceberg資料來源填寫固定值iceberg

    uri

    DLF的REST API地址,格式為 http://<VPC網路Endpoint>/iceberg,其中 <VPC網路Endpoint> 是DLF在指定地區的VPC接入網域名稱,具體取值請參見服務存取點
    例如:http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg

    iceberg.catalog.type

    Iceberg Catalog類型,DLF情境填寫固定值dlf_rest

    warehouse

    Iceberg Catalog的名稱,可以在資料湖構建控制台資料目錄頁面擷取。

    rest.signing-region

    DLF服務的Region ID,例如:cn-hangzhou

樣本

以下樣本建立了一個名為iceberg_catalog_hms的Iceberg Catalog。

使用HMS

CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
    "type" = "iceberg",
    "iceberg.catalog.type" = "hive",
    "hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);

使用DLF 1.0(舊版)

CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
    "type" = "iceberg",
    "iceberg.catalog.type" = "dlf",
    "dlf.catalog.id" = "sr_dlf"
);

使用DLF

CREATE EXTERNAL CATALOG iceberg_catalog
properties
( 
    "type" = "iceberg",
    "iceberg.catalog.type" = "dlf_rest",
    "uri" = "http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg",
    "warehouse" = "iceberg_test",
    "rest.signing-region" = "cn-hangzhou"
);

查看Iceberg Catalog

您可以通過SHOW CATALOGS查詢當前所在StarRocks裡所有Catalog。

SHOW CATALOGS;

您也可以通過SHOW CREATE CATALOG查詢某個External Catalog的建立語句。例如,通過如下命令查詢Iceberg Catalogiceberg_catalog_hms的建立語句。

SHOW CREATE CATALOG iceberg_catalog_hms;

建立Iceberg資料庫

與StarRocks內部資料目錄(Internal Catalog)一致,如果您擁有Iceberg Catalog的CREATE DATABASE許可權,那麼您可以使用CREATE DATABASE在該Iceberg Catalog內建立資料庫。本功能自3.1版本起開始支援。

說明

您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。

文法

切換至目標Iceberg Catalog,然後通過以下語句建立Iceberg資料庫。

CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>/")]

參數說明

location參數用於指定資料庫所在的檔案路徑,支援HDFS和阿里雲Object Storage Service:

  • 選擇HDFS作為儲存系統時,Prefix取值是hdfs

  • 選擇阿里雲Object Storage Service作為儲存系統時,Prefix取值是oss

說明

如果您不指定location參數,則StarRocks會在當前Iceberg Catalog的預設路徑下建立該資料庫。

切換Iceberg Catalog和資料庫

您可以通過如下方法切換至目標Iceberg Catalog和資料庫:

  • 先通過SET CATALOG指定當前會話生效的Iceberg Catalog,然後再通過USE指定資料庫。

    -- 切換當前會話生效的Catalog。
    SET CATALOG <catalog_name>;
    
    -- 指定當前會話生效的資料庫。
    USE <db_name>;
  • 通過USE直接將會話切換到目標Iceberg Catalog下的指定資料庫。

    USE <catalog_name>.<db_name>;

刪除Iceberg資料庫

同StarRocks內部資料庫一致,如果您擁有Iceberg資料庫的DROP許可權,那麼您可以使用DROP DATABASE來刪除該Iceberg資料庫。本功能自3.1版本起開始支援,僅支援刪除空資料庫。

說明

您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。

刪除資料庫操作並不會將HDFS或Object Storage Service上的對應檔案路徑刪除。切換至目標Iceberg Catalog,然後通過以下語句刪除Iceberg資料庫。

DROP DATABASE <database_name>;

刪除Iceberg Catalog

您可以通過DROP CATALOG刪除某個External Catalog。例如,通過以下命令刪除iceberg_catalog_hms

DROP Catalog iceberg_catalog_hms;

建立Iceberg

同StarRocks內部資料庫一致,如果您擁有Iceberg資料庫的CREATE TABLE許可權,那麼您可以使用CREATE TABLE或CREATE TABLE AS SELECT (CTAS)在該Iceberg資料庫下建立表。本功能自3.1版本起開始支援。切換至目標Iceberg Catalog和資料庫,然後通過如下文法建立Iceberg表。

文法

CREATE TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...
partition_column_definition1,partition_column_definition2...])
[partition_desc]
[PROPERTIES ("key" = "value", ...)]
[AS SELECT query]

參數說明

  • column_definition

    column_definition文法定義如下所示。

    col_name col_type [COMMENT 'comment']

    涉及參數說明如下表所示。

    參數

    說明

    col_name

    列名稱。

    col_type

    列資料類型。

    • 當前支援如下資料類型:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、DATE、DATETIME、CHAR、VARCHAR[(length)]、ARRAY、MAP、STRUCT。

    • 不支援LARGEINT、HLL、BITMAP類型。

    說明

    所有非分區列的預設值均為NULL。分區列必須在最後聲明,且不能為NULL

  • partition_desc

    partition_desc文法定義如下所示。

    PARTITION BY (par_col1[, par_col2...])

    目前StarRocks僅支援Identity Transforms。即會為每個唯一的分區值建立一個分區。

    說明

    分區列必須在最後聲明,支援除FLOAT、DOUBLE、DECIMAL、DATETIME以外的資料類型,並且不支援NULL值。

  • PROPERTIES

    可以在PROPERTIES中通過"key"="value"的形式聲明Iceberg表的屬性。具體請參見Iceberg 表屬性,以下列出幾個常見的屬性。

    屬性

    描述

    location

    Iceberg表所在的檔案路徑。使用HMS作為中繼資料服務時,您無需指定location參數。

    file_format

    Iceberg表的檔案格式。當前僅支援Parquet格式。預設值:parquet

    compression_codec

    Iceberg表的壓縮格式。當前支援SNAPPY、GZIP、ZSTD和LZ4。預設值:gzip。該屬性自3.2.3版本起棄用,此後寫入Iceberg表時的壓縮演算法統一由會話變數connector_sink_compression_codec控制。

樣本

  • 建立非分區表unpartition_tbl,包含idscore兩列。

    CREATE TABLE unpartition_tbl
    (
        id int,
        score double
    );
  • 建立分區表partition_tbl_1,包含actioniddt三列,並定義iddt為分區列。

    CREATE TABLE partition_tbl_1
    (
        action varchar(20),
        id int NOT NULL,
        dt date NOT NULL
    )
    PARTITION BY (id,dt);
  • 查詢原表partition_tbl_1的資料,並根據查詢結果建立分區表partition_tbl_2,定義iddtpartition_tbl_2的分區列。

    CREATE TABLE partition_tbl_2
    PARTITION BY (id, dt)
    AS SELECT * from partition_tbl_1;

查看Iceberg表結構

您可以通過如下方法查看Iceberg表的表結構。

  • 查看錶結構。

    DESC[RIBE] <catalog_name>.<database_name>.<table_name>;
  • 從CREATE命令查看錶結構和表檔案存放位置。

    SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>;

Iceberg表中插入資料

同StarRocks內表一致,如果您擁有Iceberg表的INSERT許可權,那麼您可以使用INSERT將StarRocks表資料寫入到該Iceberg表中(當前僅支援寫入到Parquet格式的Iceberg表)。本功能自3.1版本起開始支援。

說明

您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。

切換至目標Iceberg Catalog和資料庫,然後通過如下文法將StarRocks表資料寫入到Parquet格式的Iceberg表中。

文法

INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }

-- 向指定分區寫入資料。
INSERT {INTO | OVERWRITE} <table_name>
PARTITION (par_col1=<value> [, par_col2=<value>...])
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
說明

分區列不允許為NULL,因此匯入時需要保證分區列有值。

參數說明

參數

說明

INTO

將資料追加寫入目標表。

OVERWRITE

將資料覆蓋寫入目標表。

column_name

匯入的目標列。可以指定一個或多個列。指定多個列時,必須用逗號(,)分隔。指定的列必須是目標表中存在的列,並且必須包含分區列。該參數可以與源表中的列名稱不同,但順序需一一對應。如果不指定該參數,則預設匯入資料到目標表中的所有列。如果源表中的某個非分區列在目標列不存在,則寫入預設值NULL。如果查詢語句的結果列類型與目標列的類型不一致,會進行隱式轉化,如果不能進行轉化,那麼INSERT INTO語句會報文法解析錯誤。

expression

運算式,用以為對應列賦值。

DEFAULT

為對應列賦予預設值。

query

查詢語句,查詢的結果會匯入至目標表中。查詢語句支援任意StarRocks支援的SQL查詢文法。

PARTITION

匯入的目標資料分割。需要指定目標表的所有分區列,指定的分區列的順序可以與建表時定義的分區列的順序不一致。指定分區時,不允許通過列名(column_name)指定匯入的目標列。

樣本

以下寫入語句以預設的Parquet格式為例。

  • 向表partition_tbl_1中插入如下三行資料。

    INSERT INTO partition_tbl_1
    VALUES
        ("buy", 1, "2023-09-01"),
        ("sell", 2, "2023-09-02"),
        ("buy", 3, "2023-09-03");
  • 向表partition_tbl_1按指定列順序插入一個包含簡單計算的SELECT查詢的結果資料。

    INSERT INTO partition_tbl_1 (id, action, dt) SELECT 1+1, 'buy', '2023-09-03';
  • 向表partition_tbl_1中插入一個從其自身讀取資料的SELECT查詢的結果資料。

    INSERT INTO partition_tbl_1 SELECT 'buy', 1, date_add(dt, INTERVAL 2 DAY) FROM partition_tbl_1
    WHERE id=1;
  • 向表partition_tbl_2dt='2023-09-01'id=1的分區插入一個SELECT查詢的結果資料。

    • 方式1

      INSERT INTO partition_tbl_2 SELECT 'order', 1, '2023-09-01';
    • 方式2

      INSERT INTO partition_tbl_2 partition(dt='2023-09-01',id=1) SELECT 'order';
  • 將表partition_tbl_1dt='2023-09-01'id=1的分區下所有action列值全部覆蓋為close

    • 方式1

      INSERT OVERWRITE partition_tbl_1 SELECT 'close', 1, '2023-09-01';
    • 方式2

      INSERT OVERWRITE partition_tbl_1 partition(dt='2023-09-01',id=1) SELECT 'close';

查詢Iceberg表資料

  1. 通過SHOW DATABASES查看指定Catalog所屬的Iceberg叢集中的資料庫。

    SHOW DATABASES FROM <catalog_name>;
  2. 切換至目標Iceberg Catalog和資料庫。

  3. 通過SELECT查詢目標資料庫中的目標表。

    SELECT count(*) FROM <table_name> LIMIT 10;

刪除Iceberg

同StarRocks內表一致,在擁有Iceberg表的DROP許可權的情況下,您可以使用DROP TABLE來刪除該Iceberg表。本功能自3.1版本起開始支援。

說明

您可以通過GRANT和REVOKE操作對使用者和角色進行許可權的賦予和收回。

刪除表操作並不會將HDFS或Object Storage Service上的對應檔案路徑和資料刪除。強制移除表(增加FORCE關鍵字)會將HDFS或Object Storage Service上的資料刪除,但不會刪除對應檔案路徑。切換至目標Iceberg Catalog和資料庫,然後通過以下語句刪除Iceberg表。

DROP TABLE <table_name> FORCE;

相關文檔

Iceberg更多介紹,請參見Iceberg