全部產品
Search
文件中心

:Iceberg連接器

更新時間:Jul 01, 2024

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

背景資訊

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

前提條件

已建立DataLake叢集、Custom叢集或Hadoop叢集,並選擇了Trino服務,詳情請參見建立叢集

使用限制

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

配置Iceberg連接器

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

連接器預設配置

您可以進入EMR控制台的Trino服務的配置頁面,在服務配置地區,單擊iceberg.properties頁簽。您可以看到參數hive.metastore.uri,該參數表示Hive Metastore使用Thrift協議串連的URI。參數值請根據您實際情況修改。

Iceberg配置列表

您可以進入EMR控制台的Trino服務的配置頁面,在服務配置地區,單擊iceberg.properties頁簽,然後單擊新增配置項,新增以下配置項。

參數

描述

iceberg.file-format

Iceberg表的資料存放區檔案格式。支援以下格式:

  • ORC(預設值)

  • PARQUET

iceberg.compression-codec

寫入檔案時使用的壓縮格式。支援以下格式:

  • GZIP(預設值)

  • ZSTD

  • LZ4

  • SNAPPY

  • NONE

iceberg.max-partitions-per-writer

每個writer最多可處理的分區數。預設值為100。

樣本:查詢Iceberg表資料

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

  1. 通過SSH方式串連叢集,詳情請參見登入叢集

  2. 串連Trino用戶端,詳情請參見通過命令列方式串連Trino

  3. 執行以下命令,建立Schema。

    create schema iceberg.testdb;
  4. 執行以下命令,建立表iceberg_test。

    create table iceberg.testdb.iceberg_test(id int);
  5. 執行以下命令,向表iceberg_test中插入資料。

    insert into iceberg.testdb.iceberg_test values(1),(2);
    說明

    當叢集配置為使用DLF作為統一中繼資料管理服務時,不支援向Iceberg表執行寫操作。

  6. 執行以下命令,查詢表資料。

    select * from iceberg.testdb.iceberg_test;

    返回如下資訊。

     id
    ----
     1
     2

SQL文法

Iceberg連接器支援讀寫Iceberg表資料和元資訊,除了支援基礎的SQL文法,還支援下表文法。

SQL文法

描述

INSERT

詳細內容請參見INSERT

DELETE

可以參見本文的按分區刪除。更多詳情請參見DELETE

Schema and table management

可以參見本文的分區表。更多詳情請參見Schema and table management

Materialized view management

可以參見本文的物化視圖。更多詳情請參見Materialized view management

View management

詳細內容請參見View 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表。