Iceberg は、データレイク向けのオープンテーブルフォーマットです。Iceberg コネクターを使用して、Iceberg 形式のデータファイルをクエリできます。
背景情報
Iceberg の詳細については、「Iceberg」をご参照ください。
- 動的フィルタリング
- Iceberg V2 テーブルに対する読み取り操作
- Iceberg フィルタープッシュダウン
前提条件
Presto サービスがデプロイされた Hadoop クラスター、または Presto クラスターが作成されている必要があります。詳細については、「クラスターの作成」をご参照ください。
制限事項
EMR V3.38.0 以降の Hadoop クラスターまたは Presto クラスターのみが Iceberg コネクターをサポートします。
Iceberg コネクターの設定
Iceberg コネクターの設定を変更します。詳細については、「コネクターの設定」をご参照ください。
デフォルト設定
EMR コンソールで、Presto サービスの Configure ページに移動します。Service Configuration セクションで、[iceberg.properties] タブをクリックします。Thrift プロトコルを使用して Hive メタストアに接続するための URI を指定する hive.metastore.uri パラメーターがあります。実際の要件に合わせてパラメーター値を変更します。デフォルトの形式は thrift://emr-header-1.cluster-24****:9083 です。
パラメーター
EMR コンソールで、Presto サービスページに移動し、Configure タブをクリックします。Service Configuration セクションで、[iceberg.properties] タブをクリックし、次に Custom Configuration をクリックします。次の設定項目を追加できます。
| 設定項目 | 説明 |
| iceberg.file-format | Iceberg テーブルのデータが格納されるファイル形式。有効な値:
|
| iceberg.compression-codec | ファイルの書き込み時に使用する圧縮コーデック。有効な値:
|
| iceberg.max-partitions-per-writer | 各ライターが処理できる最大パーティション数。デフォルト値:100。 |
例:Iceberg テーブルのデータクエリ
Presto の基本的な SQL 構文を使用して、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); - 次のコマンドを実行して、
iceberg_testテーブルのデータをクエリします:
次の情報が返されます:select * from iceberg_test;id ---- 1 2
SQL ステートメント
| SQL ステートメント | 説明 |
| INSERT | 詳細については、Presto の公式ドキュメントの 「INSERT」 をご参照ください。 |
| DELETE | このトピックの 「パーティション単位のデータ削除」 セクションをご参照ください。 詳細については、Presto の公式ドキュメントの 「DELETE」 をご参照ください。 |
| スキーマとテーブルの管理 | このトピックの 「テーブルのパーティション分割」 セクションをご参照ください。 詳細については、Presto の公式ドキュメントの 「スキーマとテーブルの管理」 をご参照ください。 |
| マテリアライズドビューの管理 | このトピックの 「マテリアライズドビューの管理」 セクションをご参照ください。 詳細については、Presto の公式ドキュメントの 「マテリアライズドビューの管理」 をご参照ください。 |
| ビューの管理 | 詳細については、Presto の公式ドキュメントの 「ビューの管理」 をご参照ください。 |
テーブルのパーティション分割
| 関数 | 説明 |
| 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'])パーティション単位のデータ削除
customer_orders テーブルから country = 'US' のフィルター条件に一致するすべてのパーティションを削除します:DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US'DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods'スナップショットへのロールバック
Iceberg テーブルではスナップショットがサポートされています。
customer_orders テーブルの最新のスナップショット 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****)システムテーブルのパーティションのクエリ
customer_orders テーブルのパーティションをクエリできます。パーティションに関する情報には、各パーティションキー列の最大値と最小値が含まれます。SELECT * FROM iceberg.testdb."customer_orders$partitions"Iceberg テーブルのプロパティ
| プロパティ | 説明 |
| format | Iceberg テーブルのデータを格納するファイル形式を指定します。有効な値:
|
| partitioning | パーティションキー列を指定します。 たとえば、テーブルにパーティションキー列 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 テーブルに格納されます。
| ステートメント | 説明 |
| CREATE MATERIALIZED VIEW | マテリアライズドビューを作成します。 Iceberg テーブルのプロパティを使用して、Iceberg テーブルのストレージ形式を決定できます。たとえば、WITH 句で format を ORC に、partitioning を ARRAY['event_date'] に設定して、Iceberg テーブルのデータを ORC ファイルに格納し、テーブルを日単位でパーティション分割します。 |
| REFRESH MATERIALIZED VIEW | マテリアライズドビューのデータを更新します。 ステートメントを実行すると、Iceberg テーブルのデータが削除され、マテリアライズドビューで定義されたクエリの実行結果がマテリアライズドビューに挿入されます。 重要 削除操作と挿入操作の間には、短い時間差があります。マテリアライズドビューが空の場合、挿入操作が失敗すると、マテリアライズドビューは空のままになります。 また、ステートメントを実行して、マテリアライズドビューの定義と Iceberg テーブルを削除することもできます。 |