全部產品
Search
文件中心

E-MapReduce:Iceberg連接器

更新時間:Aug 21, 2026

Iceberg是一種開放的資料湖表格式,使用Iceberg連接器可以用來查詢Iceberg格式的資料檔案。

背景資訊

Iceberg的詳細資料,請參見Iceberg概述

阿里雲EMR Iceberg連接器相容社區Iceberg連接器的功能,並在此基礎上進行了深度最佳化,新增以下功能:
  • 支援Dynamic Filter。
  • 支援Iceberg V2讀取。
  • 支援Iceberg Filter下推。

前提條件

已建立Hadoop叢集,並選擇了Presto服務,或者建立單獨的Presto叢集,詳情請參見建立叢集

使用限制

EMR-3.38.0及後續版本的Hadoop叢集或Presto叢集,支援配置Iceberg連接器。

配置Iceberg連接器

修改Iceberg連接器配置,詳情請參見配置連接器

連接器預設配置

您可以進入EMR控制台的Presto服務的配置頁面,在服务配置地區,單擊iceberg.properties頁簽。您可以看到參數hive.metastore.uri,該參數表示Hive Metastore使用Thrift協議串連的URI。參數值請根據您實際情況修改。預設格式為thrift://emr-header-1.cluster-24****:9083

Iceberg配置列表

您可以進入EMR控制台的Presto服務的配置頁面,在服务配置地區,單擊iceberg.properties頁簽,單擊右側的自定义配置。您可以新增以下配置。

參數 描述
iceberg.file-format Iceberg表的資料存放區檔案格式。支援以下格式:
  • ORC(預設值)
  • PARQUET
iceberg.compression-codec 寫入檔案時使用的壓縮格式。支援以下格式:
  • GZIP(預設值)
  • ZSTD
  • LZ4
  • SNAPPY
  • NONE
iceberg.max-partitions-per-writer 每個writer最多可處理的分區數。預設值為100。

樣本:查詢Iceberg表資料

使用Presto的基本文法即可查詢Iceberg表。

  1. 通過SSH方式串連叢集,詳情請參見登入叢集
  2. 執行以下命令,串連Presto用戶端。
    presto --server emr-header-1:9090 --catalog iceberg --schema default
    返回如下資訊,表示Presto串連成功。
    presto:default>
  3. 執行以下命令,建立表iceberg_test。
    create table iceberg_test(id int);
  4. 執行以下命令,向表iceberg_test中插入資料。
    insert into iceberg_test values(1),(2);
  5. 執行以下命令,查詢表資料。
    select * from iceberg_test;
    返回如下資訊。
     id
    ----
     1
     2

SQL文法

Iceberg連接器支援讀寫Iceberg表資料和元資訊,除了支援基礎的SQL文法,還支援下表文法。
SQL文法 描述
INSERT Presto官網文檔,請參見INSERT
DELETE 可以參見本文的按分區刪除

Presto官網文檔,請參見DELETE

Schema and table management 可以參見本文的分區表

Presto官網文檔,請參見Schema and table management

Materialized views management 可以參見本文的物化視圖

Presto官網文檔,請參見Materialized views management

Views management Presto官網文檔,請參見Views management

分區表

Iceberg可以基於如下函數對錶進行分區。
函數 描述
year(ts) 按年建立分區,分區值是從ts到1970年1月1日之間的年份差。
month(ts) 按月建立分區,分區值是從ts到1970年1月1日之間的月份差。
day(ts) 按天建立分區,分區值是從ts到1970年1月1日之間的天數差。
hour(ts) 按小時建立分區,分區值是ts忽略分鐘和秒的時間戳記值。
bucket(x, nbuckets) 資料被Hash到指定數量的桶,分區值是x的整數Hash值,範圍是[0, nbuckets - 1)。
truncate(s, nchars) 分區值是s的前nchars個字元。
例如,customer_orders表按order_date的月份值、account_number的雜湊值 (桶數量為10)和country進行分區。
CREATE TABLE iceberg.testdb.customer_orders (
    order_id BIGINT,
    order_date DATE,
    account_number BIGINT,
    customer VARCHAR,
    country VARCHAR)
WITH (partitioning = ARRAY['month(order_date)', 'bucket(account_number, 10)', 'country'])

按分區刪除

對於分區表,如果WHERE子句對整個分區進行過濾,則Iceberg連接器支援刪除整個分區。例如,下面代碼將刪除country=US的所有分區。
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US'
目前,Iceberg連接器僅支援按分區刪除。例如,下面代碼選擇分區中的一些行進行刪除,運行則會報錯。
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods'

復原

Iceberg支援資料的Snapshot模型,其中錶快照由Snapshot ID標識。

Iceberg連接器為每個Iceberg表提供了一個系統快照表,快照由BIGINT類型的Snapshot ID標識,您可以通過運行以下命令查看customer_orders表的最新Snapshot ID。
SELECT snapshot_id FROM iceberg.testdb."customer_orders$snapshots" ORDER BY committed_at DESC LIMIT 1
使用system.rollback_to_snapshot可以將表的狀態復原到之前的快照ID。
CALL iceberg.system.rollback_to_snapshot('testdb', 'customer_orders', 895459706749342****)

系統資料表和列

Iceberg連接器支援查詢系統資料表分區。例如,Iceberg表customer_orders,執行以下語句可以顯示錶分區,包括每個分區列的最大值和最小值。
SELECT * FROM iceberg.testdb."customer_orders$partitions"

Iceberg表屬性

下表列出了Iceberg表的屬性。
屬性名稱 描述
format 指定表的資料檔案儲存格式。支援以下格式:
  • ORC(預設值)
  • PARQUET
partitioning 指定表的分區。

例如,表的分區列有c1和c2,該屬性便為partitioning = ARRAY['c1', 'c2']。

location 指定表所在的檔案系統地址URI。
例如,下表定義了PARQUET格式的檔案,由c1和c2列分區,檔案系統地址為/var/my_tables/test_table
CREATE TABLE test_table (
    c1 integer,
    c2 date,
    c3 double)
WITH (
    format = 'PARQUET',
    partitioning = ARRAY['c1', 'c2'],
    location = '/var/my_tables/test_table')

物化視圖

Iceberg連接器支援物化視圖,每個物化視圖包含一個視圖定義和Iceberg表,表名稱儲存在物化視圖屬性,資料存放區在Iceberg表裡。

物化視圖支援操作如下表。
動作陳述式 描述
CREATE MATERIALIZED VIEW 建立並查詢物化視圖的資料。
您可以使用Iceberg表屬性控製表儲存格式。例如,使用ORC儲存資料檔案,使用_date列按天進行分區。
WITH ( format = 'ORC', partitioning = ARRAY['event_date'] )
REFRESH MATERIALIZED VIEW 更新物化視圖的資料。
該操作會先刪除Iceberg表資料,再插入物化視圖Query定義的執行結果。
重要 刪除和插入之間有一個小的時間視窗,當物化視圖資料為空白時,如果插入操作失敗了,物化視圖會保持空資料。

您也可以使用該語句,刪除物化視圖的定義和Iceberg表。