Iceberg是一種開放的資料湖表格式,使用Iceberg連接器可以用來查詢Iceberg格式的資料檔案。
背景資訊
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表的資料存放區檔案格式。支援以下格式:
|
| iceberg.compression-codec | 寫入檔案時使用的壓縮格式。支援以下格式:
|
| iceberg.max-partitions-per-writer | 每個writer最多可處理的分區數。預設值為100。 |
樣本:查詢Iceberg表資料
使用Presto的基本文法即可查詢Iceberg表。
- 通過SSH方式串連叢集,詳情請參見登入叢集。
- 執行以下命令,串連Presto用戶端。
presto --server emr-header-1:9090 --catalog iceberg --schema default返回如下資訊,表示Presto串連成功。presto:default> - 執行以下命令,建立表iceberg_test。
create table iceberg_test(id int); - 執行以下命令,向表iceberg_test中插入資料。
insert into iceberg_test values(1),(2); - 執行以下命令,查詢表資料。
返回如下資訊。select * from iceberg_test;id ---- 1 2
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。 |
分區表
| 函數 | 描述 |
| 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個字元。 |
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'])按分區刪除
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US'DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods'復原
Iceberg支援資料的Snapshot模型,其中錶快照由Snapshot ID標識。
SELECT snapshot_id FROM iceberg.testdb."customer_orders$snapshots" ORDER BY committed_at DESC LIMIT 1CALL iceberg.system.rollback_to_snapshot('testdb', 'customer_orders', 895459706749342****)系統資料表和列
SELECT * FROM iceberg.testdb."customer_orders$partitions"Iceberg表屬性
| 屬性名稱 | 描述 |
| format | 指定表的資料檔案儲存格式。支援以下格式:
|
| partitioning | 指定表的分區。 例如,表的分區列有c1和c2,該屬性便為partitioning = ARRAY['c1', 'c2']。 |
| location | 指定表所在的檔案系統地址URI。 |
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列按天進行分區。
|
| REFRESH MATERIALIZED VIEW | 更新物化視圖的資料。 該操作會先刪除Iceberg表資料,再插入物化視圖Query定義的執行結果。
重要 刪除和插入之間有一個小的時間視窗,當物化視圖資料為空白時,如果插入操作失敗了,物化視圖會保持空資料。 您也可以使用該語句,刪除物化視圖的定義和Iceberg表。 |