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表的資料存放區檔案格式。支援以下格式:
|
iceberg.compression-codec | 寫入檔案時使用的壓縮格式。支援以下格式:
|
iceberg.max-partitions-per-writer | 每個writer最多可處理的分區數。預設值為100。 |
樣本:查詢Iceberg表資料
使用Trino的基本文法即可查詢Iceberg表。
通過SSH方式串連叢集,詳情請參見登入叢集。
串連Trino用戶端,詳情請參見通過命令列方式串連Trino。
執行以下命令,建立Schema。
create schema iceberg.testdb;
執行以下命令,建立表iceberg_test。
create table iceberg.testdb.iceberg_test(id int);
執行以下命令,向表iceberg_test中插入資料。
insert into iceberg.testdb.iceberg_test values(1),(2);
說明當叢集配置為使用DLF作為統一中繼資料管理服務時,不支援向Iceberg表執行寫操作。
執行以下命令,查詢表資料。
select * from iceberg.testdb.iceberg_test;
返回如下資訊。
id ---- 1 2
SQL文法
Iceberg連接器支援讀寫Iceberg表資料和元資訊,除了支援基礎的SQL文法,還支援下表文法。
SQL文法 | 描述 |
INSERT | 詳細內容請參見INSERT。 |
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 | 指定表的資料檔案儲存格式。支援以下格式:
|
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表裡。
物化視圖支援操作如下表。
動作陳述式 | 描述 |
建立並查詢物化視圖的資料。 您可以使用Iceberg表屬性控製表儲存格式。例如,使用ORC儲存資料檔案,使用_date列按天進行分區。
| |
更新物化視圖的資料。 該操作會先刪除Iceberg表資料,再插入物化視圖Query定義的執行結果。 重要 刪除和插入之間有一個小的時間視窗,當物化視圖資料為空白時,如果插入操作失敗了,物化視圖會保持空資料。 您也可以使用該語句,刪除物化視圖的定義和Iceberg表。 |