Iceberg是一種開放的數據湖表格式,使用Iceberg連接器可以查詢Iceberg格式的數據文件。
背景信息
Iceberg的詳細信息,請參見Iceberg概述。
前提條件
已創建DataLake集群或Hadoop集群,并選擇了Presto服務,詳情請參見創建集群。
使用限制
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表。 |