Icebergは、データレイク向けのオープンなテーブル形式です。 Icebergコネクタを使用すると、Iceberg形式のデータファイルをクエリできます。
背景情報
Icebergの詳細については、概要をご参照ください。
前提条件
DataLakeクラスタまたはHadoopクラスタが作成され、Prestoサービスが選択されています。 詳細については、クラスタの作成をご参照ください。
制限事項
E-MapReduce(EMR) V3.38.0以降のマイナーバージョンのHadoopクラスタとDataLakeクラスタのみが、Icebergコネクタをサポートしています。
Icebergコネクタを構成する
Icebergコネクタの構成を変更する方法については、コネクタの設定をご参照ください。
Icebergコネクタのデフォルト構成
EMRコンソールにログオンし、Trinoサービスページの [構成] タブに移動します。 [構成] タブで、[iceberg.properties] をクリックします。 hive.metastore.uri 構成項目がiceberg.propertiesタブに表示されます。 この構成項目は、Thriftプロトコルに基づいてアクセスできるHive MetastoreのUniform Resource Identifier(URI)を指定します。 ビジネス要件に基づいて、この構成項目を変更できます。
Iceberg構成を追加する
Trinoサービスページの [構成] タブで、[iceberg.properties] タブをクリックします。 次に、[構成項目の追加] をクリックします。
構成項目 | 説明 |
iceberg.file-format | Icebergテーブルのデータが格納されるファイル形式。有効な値:
|
iceberg.compression-codec | ファイルの書き込み時に使用される圧縮形式。有効な値:
|
iceberg.max-partitions-per-writer | 各ライターが処理できるパーティションの最大数。デフォルト値: 100。 |
例: Icebergテーブルのデータをクエリする
Trinoの基本的なSQL構文を使用して、Icebergテーブルのデータをクエリできます。
SSHモードでクラスタにログオンします。 詳細については、クラスタへのログオンをご参照ください。
Trinoクライアントに接続します。 詳細については、CLIを使用してTrinoに接続するをご参照ください。
次のコマンドを実行して、スキーマを作成します。
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テーブルからデータまたはメタデータを読み取ったり、Icebergテーブルにデータまたはメタデータを書き込んだりできます。 基本的なSQLステートメントに加えて、Icebergコネクタは次の表に示すSQLステートメントもサポートしています。
SQLステートメント | 説明 |
INSERT | 公式ドキュメントの INSERT を参照してください。 |
DELETE | このトピックの パーティションによるデータの削除 セクションと、公式ドキュメントの DELETE を参照してください。 |
スキーマとテーブルの管理に関連するステートメント | このトピックの テーブルのパーティション分割 セクションと、公式ドキュメントの スキーマとテーブルの管理 を参照してください。 |
マテリアライズドビューの管理に関連するステートメント | このトピックの マテリアライズドビュー セクションと、公式ドキュメントの マテリアライズドビューの管理 を参照してください。 |
ビューの管理に関連するステートメント | 公式ドキュメントの ビューの管理 を参照してください。 |
テーブルのパーティション分割
Icebergコネクタを使用して、関数に基づいてテーブルをパーティション分割できます。 次の表に、関数を示します。
関数 | 説明 |
year(ts) | 年ごとにテーブルをパーティション分割します。 この関数は、tsの値と 1970 年 1 月 1 日との間の年の差を返します。 |
month(ts) | 月ごとにテーブルをパーティション分割します。 この関数は、tsの値と 1970 年 1 月 1 日との間の月の差を返します。 |
day(ts) | 日ごとにテーブルをパーティション分割します。 この関数は、tsの値と 1970 年 1 月 1 日との間の日数の差を返します。 |
hour(ts) | 時間ごとにテーブルをパーティション分割します。 この関数は、tsの値に基づいてタイムスタンプを返します。 tsの値の分と秒の部分は無視されます。 |
bucket(x, nbuckets) | データに対してハッシュパーティション分割を実行し、指定された数のバケットにデータを割り当てます。 この関数は、xの整数ハッシュ値を返します。 xの整数ハッシュ値は、[0, nbuckets - 1)の範囲内です。 |
truncate(s, nchars) | sの最初のnchars文字を返します。 |
例: order_dateの値に含まれる月、account_numberのハッシュ値(バケット数: 10)、およびcountryに基づいて、customer_ordersという名前のテーブルをパーティション分割します。
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ステートメントにWHERE句を含めてパーティションをフィルタリングすると、Icebergコネクタは、パーティション分割されたテーブルでフィルタ条件を満たすパーティションを削除します。 たとえば、次のステートメントを実行して、country=USのフィルタ条件を満たすすべてのパーティションをcustomer_ordersテーブルから削除します。
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US'Icebergコネクタを使用して、パーティションごとにのみデータを削除できます。 たとえば、次のステートメントは、ステートメントのWHERE句がパーティション内の特定の行をフィルタリングするために使用されているため、実行に失敗します。
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods'スナップショットへのロールバック
スナップショットは、Icebergテーブルでサポートされています。
Icebergコネクタは、各Icebergテーブルにシステムスナップショットテーブルを提供します。 各Icebergテーブルのスナップショットは、BIGINTデータタイプの スナップショット ID によって識別されます。 たとえば、次のステートメントを実行して、customer_ordersテーブルの最新のスナップショット ID をクエリできます。
SELECT snapshot_id FROM iceberg.testdb."customer_orders$snapshots" ORDER BY committed_at DESC LIMIT 1次のステートメントを実行して、指定された スナップショット ID に基づいてテーブルの状態をスナップショットにロールバックできます。
CALL iceberg.system.rollback_to_snapshot('testdb', 'customer_orders', 895459706749342****)システムテーブルのパーティションをクエリする
Icebergコネクタを使用して、システムテーブルのパーティションをクエリできます。 たとえば、次のステートメントを実行して、customer_ordersテーブルのパーティションをクエリできます。 パーティションに関する情報には、各パーティションキー列の最大値と最小値が含まれます。
SELECT * FROM iceberg.testdb."customer_orders$partitions"Icebergテーブルのプロパティ
次の表に、Icebergテーブルのプロパティを示します。
プロパティ | 説明 |
format | Icebergテーブルのデータが格納されるファイル形式を指定します。有効な値:
|
partitioning | パーティションキー列を指定します。 たとえば、テーブルにパーティションキー列 c1 と c2 が含まれている場合、このプロパティはARRAY['c1', 'c2']に設定されます。 |
location | テーブルを格納するファイルシステムのURIを指定します。 |
次のステートメント例では、formatプロパティはPARQUETに設定され、partitioningプロパティはARRAY['c1', 'c2']に設定され、locationプロパティは /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テーブルのプロパティを使用して、Icebergテーブルのストレージ形式を決定できます。 たとえば、WITH句でformatプロパティをORCに、partitioningプロパティをARRAY['event_date']に設定して、IcebergテーブルのデータをORCファイルに格納し、テーブルを日ごとにパーティション分割します。 | |
マテリアライズドビューのデータを更新します。 ステートメントを実行すると、Icebergテーブルのデータが削除され、マテリアライズドビューで定義されたクエリの結果がマテリアライズドビューに挿入されます。 重要 削除操作と挿入操作の間には、小さな時間枠が存在します。 マテリアライズドビューが空の場合、挿入操作が失敗すると、マテリアライズドビューは空のままになります。 ステートメントを実行して、マテリアライズドビューの定義とIcebergテーブルを削除することもできます。 |