Iceberg Connector

概要

Icebergコネクタを使用すると、Icebergテーブルに格納されたデータをクエリできます。

メタストア

Icebergテーブルは、ファイルシステム上のデータとともに、ほとんどのメタデータをメタデータファイルに格納しますが、テーブルの現在のメタデータポインタの現在の場所を見つけるための中央の場所が必要です。この中央の場所をIceberg Catalogと呼びます。Presto Icebergコネクタは、HIVENESSIERESTHADOOPなどのさまざまなタイプのIceberg Catalogをサポートしています。

Icebergコネクタを設定するには、カタログプロパティファイルetc/catalog/iceberg.propertiesを作成します。カタログタイプを定義するには、iceberg.catalog.typeプロパティを、次の内容とともに指定する必要があります。プロパティ値は次のように置き換えます。

Hiveメタストアカタログ

Icebergコネクタは、Hiveコネクタと同じHMSの設定をサポートしています。

connector.name=iceberg
hive.metastore.uri=hostname:port
iceberg.catalog.type=hive

Glueカタログ

Icebergコネクタは、Hiveコネクタと同じGlueの設定をサポートしています。

connector.name=iceberg
hive.metastore=glue
iceberg.catalog.type=hive

HiveまたはGlueカタログで構成されたIcebergコネクタを使用する場合、追加の構成を利用できます。

プロパティ名

説明

デフォルト

hive.metastore.uri

Thriftプロトコルを使用して接続するHiveメタストアのURI。複数のURIが指定されている場合、最初のURIがデフォルトで使用され、残りのURIはフォールバックメタストアになります。

例:thrift://192.0.2.3:9083またはthrift://192.0.2.3:9083,thrift://192.0.2.4:9083

このプロパティは、iceberg.catalog.typehiveで、hive.metastorethriftの場合に必須です。

iceberg.hive-statistics-merge-strategy

Hive MetastoreからIcebergテーブルの統計を上書きするために使用する統計のカンマ区切りリスト。使用可能な値は、NUMBER_OF_DISTINCT_VALUESTOTAL_SIZE_IN_BYTESです。

: IcebergコネクタがHiveで構成されている場合にのみ有効です。

iceberg.hive.table-refresh.backoff-min-sleep-time

テーブルメタデータを更新するときに、再試行間でスリープする最小時間。

100ms

iceberg.hive.table-refresh.backoff-max-sleep-time

テーブルメタデータを更新するときに、再試行間でスリープする最大時間。

5秒

iceberg.hive.table-refresh.max-retry-time

テーブルメタデータのリフレッシュ操作が失敗する前に、すべての再試行にわたってかかる最大時間。

1分

iceberg.hive.table-refresh.retries

Hiveメタストアを使用してテーブルメタデータを更新する際のエラー後の再試行回数。

20

iceberg.hive.table-refresh.backoff-scale-factor

再試行間の後続の待ち時間を調整するために使用される倍数。

4.0

Nessieカタログ

Nessieカタログを使用するには、カタログタイプをiceberg.catalog.type=nessieとして構成します。

connector.name=iceberg
iceberg.catalog.type=nessie
iceberg.catalog.warehouse=/tmp
iceberg.nessie.uri=https://localhost:19120/api/v1

Nessieカタログでサポートされる追加のプロパティ

プロパティ名

説明

iceberg.nessie.ref

Nessieに使用するブランチ/タグ。デフォルトはmainです。

iceberg.nessie.uri

Nessie APIエンドポイントURI(必須)。例:https://localhost:19120/api/v1

iceberg.nessie.auth.type

使用する認証タイプ。使用可能な値はBASICまたはBEARERです。例:BEARER

注: Nessie BASIC認証タイプは非推奨になりました。これは今後のリリースで削除されます

iceberg.nessie.auth.basic.username

BASIC認証で使用するユーザー名。例:test_user

iceberg.nessie.auth.basic.password

BASIC認証で使用するパスワード。例:my$ecretPass

iceberg.nessie.auth.bearer.token

BEARER認証で使用するトークン。例:SXVLUXUhIExFQ0tFUiEK

iceberg.nessie.read-timeout-ms

Nessieサーバーへのリクエストの読み取りタイムアウト(ミリ秒単位)。例:5000

iceberg.nessie.connect-timeout-ms

Nessieサーバーへの接続リクエストの接続タイムアウト(ミリ秒単位)。例:10000

iceberg.nessie.compression-enabled

Nessieサーバーへのリクエストで圧縮を有効にするかどうか。デフォルトはtrueです。

iceberg.nessie.client-builder-impl

使用するカスタムClientBuilder実装クラスの構成。

DockerでのNessieの設定

Dockerイメージを使用してローカルでNessieインスタンスを設定するには、Nessieの設定を参照してください。Dockerインスタンスが起動して実行されると、次の例のようなログが表示されるはずです。

2023-09-05 13:11:37,905 INFO  [io.quarkus] (main) nessie-quarkus 0.69.0 on JVM (powered by Quarkus 3.2.4.Final) started in 1.921s. Listening on: http://0.0.0.0:19120
2023-09-05 13:11:37,906 INFO  [io.quarkus] (main) Profile prod activated.
2023-09-05 13:11:37,906 INFO  [io.quarkus] (main) Installed features: [agroal, amazon-dynamodb, cassandra-client, cdi, google-cloud-bigtable, hibernate-validator, jdbc-postgresql, logging-sentry, micrometer, mongodb-client, narayana-jta, oidc, opentelemetry, reactive-routes, resteasy, resteasy-jackson, security, security-properties-file, smallrye-context-propagation, smallrye-health, smallrye-openapi, swagger-ui, vertx]

NessieのOpenTelemetryコレクターに関連するログメッセージが以下の例のように表示される場合、構成オプション quarkus.otel.sdk.disabled=true を使用してOpenTelemetryを無効にできます。

2023-08-27 11:10:02,492 INFO  [io.qua.htt.access-log] (executor-thread-1) 172.17.0.1 - - [27/Aug/2023:11:10:02 +0000] "GET /api/v1/config HTTP/1.1" 200 62
2023-08-27 11:10:05,007 SEVERE [io.ope.exp.int.grp.OkHttpGrpcExporter] (OkHttp http://localhost:4317/...) Failed to export spans. The request could not be executed. Full error message: Failed to connect to localhost/127.0.0.1:4317

たとえば、次のコマンドを使用してDockerイメージを起動します。 docker run -p 19120:19120 -e QUARKUS_OTEL_SDK_DISABLED=true ghcr.io/projectnessie/nessie

この構成オプションおよびその他の関連オプションの詳細については、OpenTelemetry構成リファレンスを参照してください。

OpenTelemetryトレースのトラブルシューティングの詳細については、トレースのトラブルシューティングを参照してください。

次の例のようなエラーが表示される場合、これはおそらくhttpsサーバーではなくhttpサーバーと対話しているためです。 iceberg.nessie.urihttp://localhost:19120/api/v1 に設定する必要があります。

Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
    at sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:448)
    at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:174)
    at sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
    at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1320)
    at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1233)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:417)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:389)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:558)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:201)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
    at org.projectnessie.client.http.impl.jdk8.UrlConnectionRequest.executeRequest(UrlConnectionRequest.java:71)
    ... 42 more

RESTカタログ

RESTカタログを使用するには、カタログタイプを iceberg.catalog.type=rest として構成します。最小限の構成には以下が含まれます。

connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest.uri=https://localhost:8181

RESTカタログでサポートされている追加のプロパティ

プロパティ名

説明

iceberg.rest.uri

REST APIエンドポイントURI(必須)。例: https://localhost:8181

iceberg.rest.auth.type

使用する認証タイプ。利用可能な値は、NONE または OAUTH2 です(デフォルト: NONE)。 OAUTH2 には、クレデンシャルまたはトークンのいずれかが必要です。

iceberg.rest.auth.oauth2.credential

OAUTH2認証に使用するクレデンシャル。例: key:secret

iceberg.rest.auth.oauth2.token

OAUTH2認証に使用するベアラートークン。例: SXVLUXUhIExFQ0tFUiEK

iceberg.rest.session.type

RESTカタログと通信するときに使用するセッションタイプ。利用可能な値は、NONE または USER です(デフォルト: NONE)。

iceberg.catalog.warehouse

Icebergテーブルのカタログウェアハウスルートパス(オプション)。例: s3://warehouse/

Hadoopカタログ

Hadoopカタログを使用するには、カタログタイプを iceberg.catalog.type=hadoop として構成します。最小限の構成には以下が含まれます。

connector.name=iceberg
iceberg.catalog.type=hadoop
iceberg.catalog.warehouse=hdfs://hostname:port

Hadoopカタログ構成プロパティ

プロパティ名

説明

デフォルト

iceberg.catalog.warehouse

Icebergテーブルのカタログウェアハウスルートパス。

例: hdfs://nn:8020/warehouse/path iceberg.catalog.typehadoop の場合、このプロパティは必須です。

iceberg.catalog.cached-catalog-num

キャッシュするIcebergカタログの数。 iceberg.catalog.typehadoop の場合、このプロパティは必須です。それ以外の場合は無視されます。

10

構成プロパティ

Icebergコネクターは、HiveコネクターとしてのAmazon S3の構成オプションをサポートしています。

以下の構成プロパティは、すべてのカタログタイプで利用できます。

プロパティ名

説明

デフォルト

iceberg.catalog.type

Icebergテーブルのカタログタイプ。利用可能な値は、 HIVEHADOOPNESSIE、および REST です。

HIVE

iceberg.hadoop.config.resources

Hadoop構成リソースのパス。

例: /etc/hadoop/conf/core-site.xml。 iceberg.catalog.type が hadoop の場合、このプロパティは必須です。それ以外の場合は無視されます。

iceberg.file-format

Icebergテーブルのストレージファイル形式。利用可能な値は、PARQUET および ORC です。

PARQUET

iceberg.compression-codec

ファイルの書き込み時に使用する圧縮コーデック。利用可能な値は、 NONESNAPPYGZIPLZ4、および ZSTD です。

GZIP

iceberg.max-partitions-per-writer

ライターごとに処理される最大パーティション数。

100

iceberg.minimum-assigned-split-weight

各スプリットに割り当てられる重みの最小値として、範囲(0、1]の10進数値が使用されます。低い値は、小さなファイルを含むテーブルのパフォーマンスを向上させる可能性があります。高い値は、高度に歪んだ集計または結合を含むクエリのパフォーマンスを向上させる可能性があります。

0.05

iceberg.enable-merge-on-read-mode

更新にmerge-on-readを使用するベーステーブルの読み取りを有効にします。

true

iceberg.delete-as-join-rewrite-enabled

有効にすると、等価削除行フィルタリングが等価削除ファイルのデータとの結合として適用されます。

true

iceberg.enable-parquet-dereference-pushdown

Parquet逆参照プッシュダウンを有効にします。

true

iceberg.statistic-snapshot-record-difference-weight

統計を選択するときに、最も近いスナップショットを計算する際に、レコード総数の差が重要となる量。値1は、1つのレコードが時間差の1ミリ秒に相当することを意味します。

iceberg.pushdown-filter-enabled

実験的:Icebergのフィルタープッシュダウンを有効にします。これはNative Workerでのみサポートされています。

false

iceberg.rows-for-metadata-optimization-threshold

Icebergテーブルの、メタデータを使用してそのテーブルのクエリを最適化できる最大パーティション数。Icebergテーブルにこのしきい値を超えるパーティションがある場合、メタデータ最適化はスキップされます。

メタデータ最適化を無効にするには、0 に設定します。

1000

iceberg.split-manager-threads

Icebergスプリットの生成に使用するスレッド数。

利用可能な プロセッサ数

iceberg.metadata-previous-versions-max

現在のメタデータログに保持する古いメタデータファイルの最大数。

100

iceberg.metadata-delete-after-commit

コミットごとに最も古いメタデータファイルを削除するには、true に設定します。

false

テーブルプロパティ

テーブルプロパティは、基になるテーブルのメタデータを設定します。これは、CREATE TABLE/CREATE TABLE ASステートメントの鍵となります。テーブルプロパティは、WITH句を使用してコネクターに渡されます。

CREATE TABLE tablename
WITH (
    property_name = property_value,
    ...
)

以下のテーブルプロパティは、Presto Icebergコネクターに固有であり、利用可能です。

プロパティ名

説明

デフォルト

format

テーブルデータファイルの形式(PARQUET または ORC)を任意で指定します。

PARQUET

partitioning

テーブルパーティショニングを任意で指定します。テーブルが列 c1 および c2 でパーティション分割されている場合、パーティショニングプロパティは partitioning = ARRAY['c1', 'c2'] です。

location

テーブルのファイルシステムロケーションURIを任意で指定します。

format_version

新しいテーブルに使用するIceberg仕様の形式バージョン(1 または 2)を任意で指定します。

2

commit_retries

同時アップサートリクエストが発生した場合に、失敗する前にメタデータのコミットを試行する回数を決定します。

4

delete_mode

新しいテーブルに使用するIceberg仕様の書き込み削除モード(copy-on-write または merge-on-read)を任意で指定します。

merge-on-read

metadata_previous_versions_max

現在のメタデータログに保持する古いメタデータファイルの最大数を任意で指定します。

100

metadata_delete_after_commit

コミットごとに最も古いメタデータファイルを削除するには、true に設定します。

false

以下のテーブル定義は、形式 ORC、列 c1 および c2 によるパーティショニング、およびファイルシステムのロケーション s3://test_bucket/test_schema/test_table を指定しています。

CREATE TABLE test_table (
    c1 bigint,
    c2 varchar,
    c3 double
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['c1', 'c2'],
    location = 's3://test_bucket/test_schema/test_table')
)

セッションプロパティ

セッションプロパティは、特定のセッション内で実行されるクエリの動作変更を設定します。

プロパティ名

説明

iceberg.delete_as_join_rewrite_enabled

現在のセッションで、コネクタープロパティ iceberg.delete-as-join-rewrite-enabled の動作をオーバーライドします。

iceberg.hive_statistics_merge_strategy

現在のセッションで、コネクタープロパティ iceberg.hive-statistics-merge-strategy の動作をオーバーライドします。

iceberg.rows_for_metadata_optimization_threshold

現在のセッションで、コネクタープロパティ iceberg.rows-for-metadata-optimization-threshold の動作をオーバーライドします。

キャッシュサポート

マニフェストファイルキャッシュ

Icebergバージョン1.1.0以降、Apache IcebergはIcebergマニフェストファイルの内容をメモリにキャッシュするメカニズムを提供しています。この機能は、リモートストレージからの小さなIcebergマニフェストファイルの繰り返し読み取りを減らすのに役立ちます。

現在、マニフェストファイルキャッシュは、Presto IcebergコネクターのHadoopおよびNessieカタログでサポートされています。

以下の構成プロパティが利用可能です。

プロパティ名

説明

デフォルト

iceberg.io.manifest.cache-enabled

マニフェストのキャッシュ機能を有効または無効にします。この機能は、iceberg.catalog.typehadoop または nessie の場合にのみ利用可能です。

false

iceberg.io-impl

カタログで使用するカスタム FileIO 実装。マニフェストキャッシュを有効にするために設定する必要があります。

org.apache.iceberg.hadoop.HadoopFileIO

iceberg.io.manifest.cache.max-total-bytes

キャッシュサイズの最大サイズ(バイト単位)。

104857600

iceberg.io.manifest.cache.expiration-interval-ms

エントリがマニフェストキャッシュに保持される最大時間(ミリ秒単位)。

60000

iceberg.io.manifest.cache.max-content-length

キャッシュ対象とみなすマニフェストファイルの最大長(バイト単位)。このサイズを超える長さのマニフェストファイルはキャッシュされません。

8388608

Alluxio データキャッシュ

Presto ワーカーは、読み取り時にリモートストレージのデータを元の形式(圧縮され、場合によっては暗号化されている)でローカルSSDにキャッシュします。

Iceberg カタログファイル (catalog/iceberg.properties) には、次の構成プロパティを設定する必要があります。

cache.enabled=true
cache.base-directory=file:///mnt/flash/data
cache.type=ALLUXIO
cache.alluxio.max-cache-size=1600GB
hive.node-selection-strategy=SOFT_AFFINITY

メトリクスを取得し、キャッシュの使用状況を確認するための JMX クエリ

SELECT * FROM jmx.current."com.facebook.alluxio:name=client.cachehitrate,type=gauges";

SELECT * FROM jmx.current."com.facebook.alluxio:name=client.cachebytesreadcache,type=meters";

SHOW TABLES FROM jmx.current like '%alluxio%';

開いているファイル記述子とストライプまたはファイルフッター情報をリーフワーカーメモリにキャッシュします。これらのデータは、ファイルの読み取り時に最も頻繁にアクセスされます。

Iceberg カタログファイル (catalog/iceberg.properties) には、次の構成プロパティを設定する必要があります。

# scheduling
hive.node-selection-strategy=SOFT_AFFINITY

# orc
iceberg.orc.file-tail-cache-enabled=true
iceberg.orc.file-tail-cache-size=100MB
iceberg.orc.file-tail-cache-ttl-since-last-access=6h
iceberg.orc.stripe-metadata-cache-enabled=true
iceberg.orc.stripe-footer-cache-size=100MB
iceberg.orc.stripe-footer-cache-ttl-since-last-access=6h
iceberg.orc.stripe-stream-cache-size=300MB
iceberg.orc.stripe-stream-cache-ttl-since-last-access=6h

# parquet
iceberg.parquet.metadata-cache-enabled=true
iceberg.parquet.metadata-cache-size=100MB
iceberg.parquet.metadata-cache-ttl-since-last-access=6h

メトリクスを取得し、キャッシュの使用状況を確認するための JMX クエリ

SELECT * FROM jmx.current."com.facebook.presto.hive:name=iceberg_parquetmetadata,type=cachestatsmbean";

メタストアキャッシュ

メタストアキャッシュは、スキーマ、テーブル、およびテーブル統計のみをキャッシュします。tableCache にキャッシュされたテーブルオブジェクトは、テーブルメタデータロケーションとテーブルプロパティの読み取りにのみ使用され、残りのテーブルメタデータはファイルシステム/オブジェクトストレージのメタデータロケーションから取得されます。

メタストアキャッシュは、Presto Iceberg コネクタの Hive カタログにのみ適用できます。

hive.metastore-cache-ttl=2d
hive.metastore-refresh-interval=3d
hive.metastore-cache-maximum-size=10000000

追加の非表示メタデータ列

Iceberg コネクタは、追加の非表示メタデータ列を公開します。SELECT ステートメントに含めることで、SQL クエリの一部としてこれらの列をクエリできます。

$path

  • $path: この行のファイルのファイルシステムフルパス名

SELECT "$path", regionkey FROM "ctas_nation";
        $path                    |  regionkey
---------------------------------+-----------
 /full/path/to/file/file.parquet | 2

$data_sequence_number

  • $data_sequence_number: この行が追加された Iceberg データシーケンス番号

SELECT "$data_sequence_number", regionkey FROM "ctas_nation";
        $data_sequence_number     |  regionkey
----------------------------------+------------
             2                    | 3

追加の非表示メタデータテーブル

Iceberg コネクタは、追加の非表示メタデータテーブルを公開します。テーブルに名前を追加することで、SQL クエリの一部としてこれらのテーブルをクエリできます。

$properties テーブル

  • $properties : 指定されたテーブルの一般的なプロパティ

SELECT * FROM "ctas_nation$properties";
        key           |  value
----------------------+---------
 write.format.default | PARQUET

$history テーブル

  • $history : テーブル状態の変更履歴

SELECT * FROM "ctas_nation$history";
           made_current_at            |     snapshot_id     | parent_id | is_current_ancestor
--------------------------------------+---------------------+-----------+---------------------
2022-11-25 20:56:31.784 Asia/Kolkata  | 7606232158543069775 | NULL      | true

$snapshots テーブル

  • $snapshots : テーブルスナップショットに関する詳細。詳細については、Iceberg Table Spec の Snapshots を参照してください。

SELECT * FROM "ctas_nation$snapshots";
             committed_at             |     snapshot_id     | parent_id | operation |                                                  manifest_list                                           |                                                                                 summary
--------------------------------------+---------------------+-----------+-----------+----------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2022-11-25 20:56:31.784 Asia/Kolkata  | 7606232158543069775 | NULL      | append    | s3://my-bucket/ctas_nation/metadata/snap-7606232158543069775-1-395a2cad-b244-409b-b030-cc44949e5a4e.avro | {changed-partition-count=1, added-data-files=1, total-equality-deletes=0, added-records=25, total-position-deletes=0, added-files-size=1648, total-delete-files=0, total-files-size=1648, total-records=25, total-data-files=1}

$manifests テーブル

  • $manifests : さまざまなテーブルスナップショットのマニフェストに関する詳細。詳細については、Iceberg Table Spec の Manifests を参照してください。

SELECT * FROM "ctas_nation$manifests";
                                           path                                  | length | partition_spec_id |  added_snapshot_id  | added_data_files_count | existing_data_files_count | deleted_data_files_count | partitions
---------------------------------------------------------------------------------+--------+-------------------+---------------------+------------------------+---------------------------+--------------------------+-----------
s3://my-bucket/ctas_nation/metadata/395a2cad-b244-409b-b030-cc44949e5a4e-m0.avro |   5957 |                 0 | 7606232158543069775 |                      1 |                         0 |                    0     |    []

$partitions テーブル

  • $partitions : テーブルの詳細なパーティション情報

SELECT * FROM "ctas_nation$partitions";
 row_count | file_count | total_size |           nationkey           |                   name                   |          regionkey           |                          comment
-----------+------------+------------+-------------------------------+------------------------------------------+------------------------------+------------------------------------------------------------
    25     |          1 |       1648 | {min=0, max=24, null_count=0} | {min=ALGERIA, max=VIETNAM, null_count=0} | {min=0, max=4, null_count=0} | {min= haggle. careful, max=y final packaget, null_count=0}

$files テーブル

  • $files : テーブルの現在のスナップショット内のデータファイルの概要

SELECT * FROM "ctas_nation$files";
 content |                                      file_path                               | file_format | record_count | file_size_in_bytes |        column_sizes         |       value_counts       |  null_value_counts   | nan_value_counts |          lower_bounds                     |             upper_bounds                   | key_metadata | split_offsets | equality_ids
---------+------------------------------------------------------------------------------+-------------+--------------+--------------------+-----------------------------+--------------------------+----------------------+------------------+-------------------------------------------+--------------------------------------------+--------------+---------------+-------------
   0     | s3://my-bucket/ctas_nation/data/9f889274-6f74-4d28-8164-275eef99f660.parquet | PARQUET     |           25 |               1648 | {1=52, 2=222, 3=105, 4=757} | {1=25, 2=25, 3=25, 4=25} | {1=0, 2=0, 3=0, 4=0} |  NULL            | {1=0, 2=ALGERIA, 3=0, 4= haggle. careful} | {1=24, 2=VIETNAM, 3=4, 4=y final packaget} | NULL         | NULL          | NULL

$changelog テーブル

このテーブルを使用すると、特定の順序で、時間経過に伴ってテーブルに発生した行レベルの変更を確認できます。$changelog テーブルはテーブルに対する変更の履歴を表すと同時に、クエリを通じて処理可能なデータも提供します。

変更ログクエリの結果は常に、4つの列を持つ静的スキーマを返します。

  1. operation: (VARCHAR) 行が挿入、更新、または削除されたかを示す。

  2. ordinal: (int) 特定の変更を他のすべての変更に対してテーブルに適用する必要がある相対的な順序を示す数値。

  3. snapshotid: (bigint) 行レベルの変更が行われたスナップショットを表します。

  4. rowdata: (row(T)) 特定の行のデータが含まれます。この型の内部値は、親テーブルのスキーマと一致します。

変更ログテーブルは、次の名前形式でクエリできます。

... FROM "<table>[@<begin snapshot ID>]$changelog[@<end snapshot ID>]"
  • <table> は、テーブルの名前です。

  • <begin snapshot ID> は、変更の表示を開始するテーブルのスナップショットです。このパラメーターはオプションです。指定しない場合は、利用可能な最も古いスナップショットが使用されます。

  • <end snapshot ID> は、変更を表示する最後のスナップショットです。このパラメーターはオプションです。指定しない場合は、テーブルの最新のスナップショットが使用されます。

$changelog テーブルの用途の 1 つは、レコードがいつテーブルに挿入または削除されたかを検出することです。これを実現するために、$changelog テーブルは $snapshots テーブルと組み合わせて使用できます。まず、$snapshots テーブルからスナップショット ID を選択して、開始点を選択します。

SELECT * FROM "orders$snapshots";
                committed_at                 |     snapshot_id     |      parent_id      | operation |                                                                                       manifest_list                                                                                        |                                                                                                              summary
---------------------------------------------+---------------------+---------------------+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2023-09-26 08:45:20.930 America/Los_Angeles | 2423571386296047175 | NULL                | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-2423571386296047175-1-3f288b1c-95a9-406b-9e17-9cfe31a11b48.avro | {changed-partition-count=1, added-data-files=4, total-equality-deletes=0, added-records=100, total-position-deletes=0, added-files-size=9580, total-delete-files=0, total-files-size=9580, total-records=100, total-data-files=4}
 2023-09-26 08:45:36.942 America/Los_Angeles | 8702997868627997320 | 2423571386296047175 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-8702997868627997320-1-a2e1c714-7eed-4e2c-b144-dae4147ebaa4.avro | {changed-partition-count=1, added-data-files=1, total-equality-deletes=0, added-records=1, total-position-deletes=0, added-files-size=1687, total-delete-files=0, total-files-size=11267, total-records=101, total-data-files=5}
 2023-09-26 08:45:39.866 America/Los_Angeles | 7615903782581283889 | 8702997868627997320 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-7615903782581283889-1-d94c2114-fd22-4de2-9ab5-c0b5bf67282f.avro | {changed-partition-count=1, added-data-files=3, total-equality-deletes=0, added-records=3, total-position-deletes=0, added-files-size=4845, total-delete-files=0, total-files-size=16112, total-records=104, total-data-files=8}
 2023-09-26 08:45:48.404 America/Los_Angeles |  677209275408372885 | 7615903782581283889 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-677209275408372885-1-ad69e208-1440-459b-93e8-48e61f961758.avro  | {changed-partition-count=1, added-data-files=3, total-equality-deletes=0, added-records=5, total-position-deletes=0, added-files-size=4669, total-delete-files=0, total-files-size=20781, total-records=109, total-data-files=11}

これで、変更ログでクエリできるスナップショットがわかったので、テーブルの作成以降に加えられた変更を確認できます。具体的には、この例では、最も古いスナップショット ID: 2423571386296047175 を使用します。

SELECT * FROM "ctas_orders@2423571386296047175$changelog" ORDER BY ordinal;
 operation | ordinal |     snapshotid      |                                                                                                                   rowdata
-----------+---------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 INSERT    |       0 | 8702997868627997320 | {orderkey=37504, custkey=1291, orderstatus=O, totalprice=165509.83, orderdate=1996-03-04, orderpriority=5-LOW, clerk=Clerk#000000871, shippriority=0, comment=c theodolites alongside of the fluffily bold requests haggle quickly against }
 INSERT    |       1 | 7615903782581283889 | {orderkey=12001, custkey=739, orderstatus=F, totalprice=138635.75, orderdate=1994-07-07, orderpriority=2-HIGH, clerk=Clerk#000000863, shippriority=0, comment=old, even theodolites. regular, special theodolites use furio}
 INSERT    |       1 | 7615903782581283889 | {orderkey=17989, custkey=364, orderstatus=F, totalprice=133669.05, orderdate=1994-01-17, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000547, shippriority=0, comment=ously express excuses. even theodolit}
 INSERT    |       1 | 7615903782581283889 | {orderkey=37504, custkey=1291, orderstatus=O, totalprice=165509.83, orderdate=1996-03-04, orderpriority=5-LOW, clerk=Clerk#000000871, shippriority=0, comment=c theodolites alongside of the fluffily bold requests haggle quickly against }
 INSERT    |       2 |  677209275408372885 | {orderkey=17991, custkey=92, orderstatus=O, totalprice=20732.51, orderdate=1998-07-09, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000636, shippriority=0, comment= the quickly express accounts. iron}
 INSERT    |       2 |  677209275408372885 | {orderkey=17989, custkey=364, orderstatus=F, totalprice=133669.05, orderdate=1994-01-17, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000547, shippriority=0, comment=ously express excuses. even theodolit}
 INSERT    |       2 |  677209275408372885 | {orderkey=17990, custkey=458, orderstatus=O, totalprice=218031.58, orderdate=1998-03-18, orderpriority=3-MEDIUM, clerk=Clerk#000000340, shippriority=0, comment=ounts wake final foxe}
 INSERT    |       2 |  677209275408372885 | {orderkey=18016, custkey=403, orderstatus=O, totalprice=174070.99, orderdate=1996-03-19, orderpriority=1-URGENT, clerk=Clerk#000000629, shippriority=0, comment=ly. quickly ironic excuses are furiously. carefully ironic pack}
 INSERT    |       2 |  677209275408372885 | {orderkey=18017, custkey=958, orderstatus=F, totalprice=203091.02, orderdate=1993-03-26, orderpriority=1-URGENT, clerk=Clerk#000000830, shippriority=0, comment=sleep quickly bold requests. slyly pending pinto beans haggle in pla}

プロシージャ

CALL ステートメントを使用して、データ操作または管理タスクを実行します。プロシージャは、カタログの system スキーマで使用できます。

テーブルの登録

ファイルシステムにテーブルデータとメタデータがすでに存在する Iceberg テーブルをカタログに登録できます。カタログの system スキーマで register_table プロシージャを使用し、ターゲットスキーマ、目的のテーブル名、およびテーブルメタデータの場所を指定します。

CALL iceberg.system.register_table('schema_name', 'table_name', 'hdfs://localhost:9000/path/to/iceberg/table/metadata/dir')

指定された場所に同じバージョンのメタデータファイルが複数存在する場合、最後に変更されたものが使用されます。

特定のメタデータファイルにターゲットテーブルの状態が含まれている場合は、メタデータファイルを register_table の引数としてオプションで含めることができます。

CALL iceberg.system.register_table('schema_name', 'table_name', 'hdfs://localhost:9000/path/to/iceberg/table/metadata/dir', '00000-35a08aed-f4b0-4010-95d2-9d73ef4be01c.metadata.json')

Iceberg REST カタログは、バックアップカタログのタイプによってはテーブル登録をサポートしていない場合があります。

Hive メタストアでテーブルを登録すると、プロシージャを呼び出すユーザーがテーブルの所有者として設定され、そのテーブルに対して SELECTINSERTUPDATE、および DELETE 権限が付与されます。これらの権限は、GRANT および REVOKE コマンドを使用して変更できます。

Hive カタログを使用する場合、Hive コネクタを使用して登録された Iceberg テーブルを読み取ろうとすると失敗します。

テーブルの登録解除

カタログから Iceberg テーブルの登録を解除するには、カタログの system スキーマで unregister_table プロシージャを使用します。

CALL iceberg.system.unregister_table('schema_name', 'table_name')

unregister_table を呼び出した後、Hive カタログを使用している場合にのみ、テーブルデータとメタデータがファイルシステムに残ります。これは、DROP TABLE コマンドにリストされている動作と同様です。

スナップショットへのロールバック

テーブルを特定のスナップショット ID にロールバックします。Iceberg は、Iceberg の system スキーマで rollback_to_snapshot プロシージャを使用することにより、特定のスナップショット ID にロールバックできます。

CALL iceberg.system.rollback_to_snapshot('table_name', 'snapshot_id');

次の引数を使用できます。

引数名

必須

説明

テーブル

✔️

文字列

更新するテーブルの名前

snapshot_id

✔️

long

ロールバック先のスナップショット ID

スナップショットの有効期限

Iceberg の各 DML (データ操作言語) アクションは、スナップショットの分離とタイムトラベルのために古いデータとメタデータを保持しながら、新しいスナップショットを生成します。古いスナップショットとそのファイルを削除するには、expire_snapshots を使用します。

このプロシージャは、古いスナップショットとそれに対応するファイルを削除しますが、期限切れでないスナップショットに必要なファイルは決して削除しません。

次の引数を使用できます。

引数名

必須

説明

schema

✔️

文字列

更新するテーブルのスキーマ

table_name

✔️

文字列

更新するテーブルの名前

older_than

タイムスタンプ

スナップショットが削除される前のタイムスタンプ(デフォルト:5日前)

retain_last

int

older_than に関係なく保持する先祖スナップショットの数(デフォルトは 1)

snapshot_ids

long の配列

期限切れにするスナップショット ID の配列

  • 特定の日時より古いスナップショットを削除しますが、最後の 10 個のスナップショットは保持します

    CALL iceberg.system.expire_snapshots('schema_name', 'table_name', TIMESTAMP '2023-08-31 00:00:00.000', 10);
    
  • スナップショット ID 10001 および 10002 を持つスナップショットを削除します(これらのスナップショット ID は現在のスナップショットではないことに注意してください)

    CALL iceberg.system.expire_snapshots(schema => 'schema_name', table_name => 'table_name', snapshot_ids => ARRAY[10001, 10002]);
    

孤立ファイルの削除

Iceberg テーブルのメタデータファイルで参照されていないファイルを削除するために使用します。

次の引数を使用できます。

引数名

必須

説明

schema

✔️

文字列

クリーンアップするテーブルのスキーマ

table_name

✔️

文字列

クリーンアップするテーブルの名前

older_than

タイムスタンプ

このタイムスタンプより前に作成された孤立ファイルを削除します(デフォルト:3日前)

  • テーブル db.sample に認識されておらず、指定されたタイムスタンプより古いファイルをすべて削除します

    CALL iceberg.system.remove_orphan_files('db', 'sample', TIMESTAMP '2023-08-31 00:00:00.000');
    
  • テーブル db.sample に登録されていない、かつ3日前(デフォルト)に作成されたファイルを削除します。

    CALL iceberg.system.remove_orphan_files(schema => 'db', table_name => 'sample');
    

SQLサポート

Icebergコネクタは、Icebergのテーブルとスキーマ(データベース)のクエリと操作をサポートしています。以下は、PrestoでサポートされているSQL操作の例です。

CREATE SCHEMA

my-bucket という名前のS3バケットにテーブルを保存する、web という名前の新しいIcebergスキーマを作成します。

CREATE SCHEMA iceberg.web
WITH (location = 's3://my-bucket/')

CREATE TABLE

dscountry でパーティション分割され、ORCファイル形式を使用して保存される web スキーマに、page_views という名前の新しいIcebergテーブルを作成します。

CREATE TABLE iceberg.web.page_views (
  view_time timestamp,
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
)
WITH (
  format = 'ORC',
  partitioning = ARRAY['ds', 'country']
)

Icebergフォーマットバージョン2でIcebergテーブルを作成します。

CREATE TABLE iceberg.web.page_views_v2 (
  view_time timestamp,
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
)
WITH (
  format = 'ORC',
  partitioning = ARRAY['ds', 'country'],
  format_version = '2'
)

パーティション列の変換

パーティション分割のために特定の列を選択するだけでなく、transform 関数を使用して、列の変換された値でテーブルをパーティション分割できます。

Presto Icebergコネクタで使用可能な変換は次のとおりです。

  • Bucket(ハッシュ関数を使用して、指定された数のバケットにデータをパーティション分割します)

  • Truncate(フィールドの切り捨てられた値に基づいてテーブルをパーティション分割し、切り捨てられた値の幅を指定できます)

  • Identity(変更されていないソース値を使用してデータをパーティション分割します)

  • Year(日付またはタイムスタンプの年を1970年からの年として抽出して、整数値を使用してデータをパーティション分割します)

  • Month(日付またはタイムスタンプの月を1970-01-01からの月として抽出して、整数値を使用してデータをパーティション分割します)

  • Day(日付またはタイムスタンプの日を1970-01-01からの日として抽出して、整数値を使用してデータをパーティション分割します)

  • Hour(タイムスタンプの時間を1970-01-01 00:00:00からの時間として抽出して、整数値を使用してデータをパーティション分割します)

等しいサイズの範囲の8つのバケットにパーティション分割されたIcebergテーブルを作成します。

CREATE TABLE players (
    id int,
    name varchar,
    team varchar
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['bucket(team, 8)']
);

team フィールドの最初の文字でパーティション分割されたIcebergテーブルを作成します。

CREATE TABLE players (
    id int,
    name varchar,
    team varchar
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['truncate(team, 1)']
);

ds でパーティション分割されたIcebergテーブルを作成します。

CREATE TABLE players (
    id int,
    name varchar,
    team varchar,
    ds date
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['year(ds)']
);

ts でパーティション分割されたIcebergテーブルを作成します。

CREATE TABLE players (
    id int,
    name varchar,
    team varchar,
    ts timestamp
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['hour(ts)']
);

CREATE VIEW

Icebergコネクタは、HiveおよびGlueメタストアでのビューの作成をサポートしています。 CREATE TABLE の例で作成された iceberg.web.page_views テーブルの view_page_views という名前のビューを作成するには、次のようにします。

CREATE VIEW iceberg.web.view_page_views AS SELECT user_id, country FROM iceberg.web.page_views;

INSERT INTO

page_views テーブルにデータを挿入します。

INSERT INTO iceberg.web.page_views VALUES(TIMESTAMP '2023-08-12 03:04:05.321', 1, 'https://example.com', current_date, 'country');

CREATE TABLE AS SELECT

既存のテーブル page_views から新しいテーブル page_views_new を作成します。

CREATE TABLE iceberg.web.page_views_new AS SELECT * FROM iceberg.web.page_views

SELECT

SELECTテーブル操作は、コネクタのIcebergフォーマットバージョン1およびバージョン2でサポートされています。

SELECT * FROM iceberg.web.page_views;

SELECT * FROM iceberg.web.page_views_v2;

削除ファイル付きのテーブル

Iceberg V2テーブルは、行レベルの削除をサポートしています。詳細については、Iceberg Table Specの行レベルの削除を参照してください。 Prestoは、Position Delete FileおよびEquality Delete Fileを含む、削除ファイルの読み取りをサポートしています。 Prestoは読み取り時にこれらの削除ファイルをマージして、最新の結果を読み取ります。

ALTER TABLE

テーブルの変更操作は、Icebergコネクタでサポートされています。

ALTER TABLE iceberg.web.page_views ADD COLUMN zipcode VARCHAR;

ALTER TABLE iceberg.web.page_views RENAME COLUMN zipcode TO location;

ALTER TABLE iceberg.web.page_views DROP COLUMN location;

新しい列をパーティション列として追加するには、列の変換関数を特定します。テーブルは、列の変換された値でパーティション分割されます。

ALTER TABLE iceberg.web.page_views ADD COLUMN zipcode VARCHAR WITH (partitioning = 'identity');

ALTER TABLE iceberg.web.page_views ADD COLUMN location VARCHAR WITH (partitioning = 'truncate(2)');

ALTER TABLE iceberg.web.page_views ADD COLUMN location VARCHAR WITH (partitioning = 'bucket(8)');

ALTER TABLE iceberg.web.page_views ADD COLUMN dt date WITH (partitioning = 'year');

ALTER TABLE iceberg.web.page_views ADD COLUMN ts timestamp WITH (partitioning = 'month');

ALTER TABLE iceberg.web.page_views ADD COLUMN dt date WITH (partitioning = 'day');

ALTER TABLE iceberg.web.page_views ADD COLUMN ts timestamp WITH (partitioning = 'hour');

TRUNCATE

Icebergコネクタは、TRUNCATE TABLE を使用して、メタデータカタログからテーブルをドロップすることなく、テーブルからすべてのデータを削除できます。

TRUNCATE TABLE nation;
TRUNCATE TABLE;
SELECT * FROM nation;
 nationkey | name | regionkey | comment
-----------+------+-----------+---------
(0 rows)

DELETE

Icebergコネクタは、DELETE FROM を使用してテーブルからデータを削除できます。たとえば、テーブル lineitem から削除するには、次のようにします。

DELETE FROM lineitem;

DELETE FROM lineitem WHERE linenumber = 1;

DELETE FROM lineitem WHERE linenumber not in (1, 3, 5, 7) and linestatus in ('O', 'F');

フィルター処理された列は、EQUALS、LESS THAN、LESS THAN EQUALSなどの比較演算子のみをサポートします。

削除は、最新のスナップショットでのみ発生する必要があります。

V1テーブルの場合、Icebergコネクタは1つ以上のパーティション全体でのみデータを削除できます。フィルター内の列はすべて、ターゲットテーブルの同一変換されたパーティション列である必要があります。

DROP TABLE

page_views テーブルをドロップします。

DROP TABLE iceberg.web.page_views
  • Hive MetastoreおよびGlueカタログを使用してIcebergテーブルをドロップすると、メタストアからメタデータのみが削除されます。

  • HadoopおよびNessieカタログを使用してIcebergテーブルをドロップすると、テーブル内のすべてのデータとメタデータが削除されます。

DROP VIEW

view_page_views ビューをドロップします。

DROP VIEW iceberg.web.view_page_views;

DROP SCHEMA

iceberg.web スキーマをドロップします。

DROP SCHEMA iceberg.web

SHOW CREATE TABLE

SHOW CREATE TABLE を使用して、指定されたIcebergテーブルを作成するSQLステートメントを表示します。

たとえば、パーティション分割されたIcebergテーブル customer からの SHOW CREATE TABLE は次のようになります。

SHOW CREATE TABLE customer;
CREATE TABLE iceberg.tpch_iceberg.customer (
    "custkey" bigint,
    "name" varchar,
    "address" varchar,
    "nationkey" bigint,
    "phone" varchar,
    "acctbal" double,
    "mktsegment" varchar,
    "comment" varchar
)
WITH (
    delete_mode = 'copy-on-write',
    format = 'PARQUET',
    format_version = '2',
    location = 's3a://tpch-iceberg/customer',
    partitioning = ARRAY['mktsegment']
)
(1 row)

パーティション分割されていないIcebergテーブル region からの SHOW CREATE TABLE は次のようになります。

SHOW CREATE TABLE region;
CREATE TABLE iceberg.tpch_iceberg.region (
    "regionkey" bigint,
    "name" varchar,
    "comment" varchar
)
WITH (
    delete_mode = 'copy-on-write',
    format = 'PARQUET',
    format_version = '2',
    location = 's3a://tpch-iceberg/region'
)
(1 row)

SHOW COLUMNS

SHOW COLUMNS を使用して、テーブル内の列をデータ型やその他の属性とともに一覧表示します。

たとえば、パーティション分割されたIcebergテーブル customer からの SHOW COLUMNS は次のようになります。

SHOW COLUMNS FROM customer;
   Column   |  Type   |     Extra     | Comment
------------+---------+---------------+---------
 custkey    | bigint  |               |
 name       | varchar |               |
 address    | varchar |               |
 nationkey  | bigint  |               |
 phone      | varchar |               |
 acctbal    | double  |               |
 mktsegment | varchar | partition key |
 comment    | varchar |               |
 (8 rows)

パーティション分割されていないIcebergテーブル region からの SHOW COLUMNS は次のようになります。

SHOW COLUMNS FROM region;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 regionkey | bigint  |       |
 name      | varchar |       |
 comment   | varchar |       |
 (3 rows)

DESCRIBE

DESCRIBE を使用して、テーブル内の列をデータ型やその他の属性とともに一覧表示します。 DESCRIBESHOW COLUMNS のエイリアスです。

たとえば、パーティション分割されたIcebergテーブル customer からの DESCRIBE は次のようになります。

DESCRIBE customer;
   Column   |  Type   |     Extra     | Comment
------------+---------+---------------+---------
 custkey    | bigint  |               |
 name       | varchar |               |
 address    | varchar |               |
 nationkey  | bigint  |               |
 phone      | varchar |               |
 acctbal    | double  |               |
 mktsegment | varchar | partition key |
 comment    | varchar |               |
 (8 rows)

パーティション分割されていないIcebergテーブル region からの DESCRIBE は次のようになります。

DESCRIBE region;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 regionkey | bigint  |       |
 name      | varchar |       |
 comment   | varchar |       |
 (3 rows)

スキーマの進化

IcebergとPresto Icebergコネクタは、列の追加、削除、名前変更など、インプレーステーブルの進化(スキーマの進化とも呼ばれる)をサポートしています。スキーマの進化により、ユーザーはPresto Icebergコネクタを有効にした後、SQLでテーブルスキーマを進化させることができます。

Parquetライターのバージョン

Prestoは、Icebergカタログ用にParquetライターバージョンV1とV2をサポートするようになりました。これは、セッションプロパティ parquet_writer_version と構成プロパティ hive.parquet.writer.version を使用して切り替えることができます。これらのプロパティの有効な値は PARQUET_1_0PARQUET_2_0 です。デフォルトは PARQUET_1_0 です。

クエリの例

TPCH nation テーブルから作成された、ctas_nation という名前のIcebergテーブルを作成しましょう。テーブルには、nationkeynameregionkeycomment の4つの列があります。

USE iceberg.tpch;
CREATE TABLE IF NOT EXISTS ctas_nation AS (SELECT * FROM nation);
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

ALTER TABLE ステートメントを使用して、新しい列をIcebergテーブルに簡単に追加できます。次のクエリは、zipcode という名前の新しい列をテーブルに追加します。

ALTER TABLE ctas_nation ADD COLUMN zipcode VARCHAR;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
 zipcode   | varchar |       |
(5 rows)

新しい列の名前を address という別の名前に変更することもできます。

ALTER TABLE ctas_nation RENAME COLUMN zipcode TO address;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
 address  | varchar |       |
(5 rows)

最後に、新しい列を削除できます。テーブル列は元の状態に戻ります。

ALTER TABLE ctas_nation DROP COLUMN address;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

タイムトラベル

IcebergとPresto Icebergコネクタは、一意のスナップショットIDで識別されるテーブルスナップショットを介したタイムトラベルをサポートしています。スナップショットIDは、$snapshots メタデータテーブルに格納されます。テーブルの状態を以前のスナップショットIDにロールバックできます。また、VERSION(SYSTEM_VERSION)およびTIMESTAMP(SYSTEM_TIME)オプションを使用したタイムトラベルクエリもサポートしています。

クエリの例

スキーマの進化のクエリ例と同様に、TPCH nation テーブルから ctas_nation という名前のIcebergテーブルを作成します。

USE iceberg.tpch;
CREATE TABLE IF NOT EXISTS ctas_nation AS (SELECT * FROM nation);
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

$snapshots メタデータテーブルからIcebergテーブルのスナップショットIDを見つけることができます。

SELECT snapshot_id FROM iceberg.tpch."ctas_nation$snapshots" ORDER BY committed_at;
     snapshot_id
---------------------
 5837462824399906536
(1 row)

今のところ、テーブルを作成したばかりなので、スナップショットIDは1つしかありません。テーブルに1行挿入して、スナップショットIDの変更を確認してみましょう。

INSERT INTO ctas_nation VALUES(25, 'new country', 1, 'comment');
SELECT snapshot_id FROM iceberg.tpch."ctas_nation$snapshots" ORDER BY committed_at;
     snapshot_id
---------------------
 5837462824399906536
 5140039250977437531
(2 rows)

テーブルに新しい行が挿入されると、新しいスナップショット(5140039250977437531)が作成されます。新しい行は、次を実行して検証できます。

SELECT * FROM ctas_nation WHERE name = 'new country';
 nationkey |    name     | regionkey | comment
-----------+-------------+-----------+---------
        25 | new country |         1 | comment
(1 row)

タイムトラベル機能を使用すると、iceberg.system.rollback_to_snapshot を呼び出すことで、新しい行なしで以前の状態にロールバックできます。

CALL iceberg.system.rollback_to_snapshot('tpch', 'ctas_nation', 5837462824399906536);

ここで、テーブルをもう一度確認すると、以前の状態にロールバックしたため、新しく挿入された行は存在しなくなっていることがわかります。

SELECT * FROM ctas_nation WHERE name = 'new country';
 nationkey | name | regionkey | comment
-----------+------+-----------+---------
(0 rows)

VERSION(SYSTEM_VERSION)およびTIMESTAMP(SYSTEM_TIME)を使用したタイムトラベル

Icebergコネクタを使用して、テーブルの過去のデータにアクセスします。データが変更または削除された場合でも、特定の時点でのテーブルの表示方法を確認できます。

// snapshot ID 5300424205832769799
INSERT INTO ctas_nation VALUES(10, 'united states', 1, 'comment');

// snapshot ID 6891257133877048303
INSERT INTO ctas_nation VALUES(20, 'canada', 2, 'comment');

// snapshot ID 705548372863208787
INSERT INTO ctas_nation VALUES(30, 'mexico', 3, 'comment');

// snapshot ID for first record
SELECT * FROM ctas_nation FOR VERSION AS OF 5300424205832769799;

// snapshot ID for first record using SYSTEM_VERSION
SELECT * FROM ctas_nation FOR SYSTEM_VERSION AS OF 5300424205832769799;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)
// snapshot ID for second record using BEFORE clause to retrieve previous state
SELECT * FROM ctas_nation FOR SYSTEM_VERSION BEFORE 6891257133877048303;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)

上記の例では、SYSTEM_VERSIONをVERSIONのエイリアスとして使用できます。

FOR TIMESTAMP AS OF TIMESTAMPを使用して、テーブルの過去のデータにアクセスできます。クエリは、指定されたタイムスタンプに最も近いテーブルスナップショットを使用して、テーブルの状態を返します。この例では、SYSTEM_TIMEをTIMESTAMPのエイリアスとして使用できます。

// In following query, timestamp string is matching with second inserted record.
SELECT * FROM ctas_nation FOR TIMESTAMP AS OF TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';

// Same example using SYSTEM_TIME as an alias for TIMESTAMP
SELECT * FROM ctas_nation FOR SYSTEM_TIME AS OF TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
        20 | canada        |         2 | comment
(2 rows)

FOR TIMESTAMP AS OF に続くオプションは、タイムゾーン値を持つタイムスタンプを返す任意の式を受け入れることができます。たとえば、TIMESTAMP ‘2023-10-17 13:29:46.822 America/Los_Angeles’ は、式の定数文字列です。次のクエリでは、式 CURRENT_TIMESTAMP がタイムゾーン値を持つ現在のタイムスタンプを返します。

SELECT * FROM ctas_nation FOR TIMESTAMP AS OF CURRENT_TIMESTAMP;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
        20 | canada        |         2 | comment
        30 | mexico        |         3 | comment
(3 rows)
// In following query, timestamp string is matching with second inserted record.
// BEFORE clause returns first record which is less than timestamp of the second record.
SELECT * FROM ctas_nation FOR TIMESTAMP BEFORE TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)

型マッピング

PrestoDBとIcebergは、互いにサポートしていないデータ型を持っています。Icebergを使用してデータを読み書きする際、Prestoは各Icebergデータ型を対応するPrestoデータ型に、また各Prestoデータ型を同等のIcebergデータ型に変換します。以下の表は、PrestoDBとIceberg間の具体的な型マッピングを詳細に示しています。

IcebergからPrestoDBへの型マッピング

Iceberg型と関連するPrestoDB型のマッピング

IcebergからPrestoDBへの型マッピング

Iceberg型

PrestoDB型

BOOLEAN

BOOLEAN

BINARY, FIXED

VARBINARY

DATE

DATE

DECIMAL

DECIMAL

DOUBLE

DOUBLE

LONG

BIGINT

FLOAT

REAL

INTEGER

INTEGER

TIME

TIME

TIMESTAMP

TIMESTAMP

STRING

VARCHAR

LIST

ARRAY

MAP

MAP

STRUCT

ROW

その他の型はサポートされていません。

PrestoDBからIcebergへの型マッピング

PrestoDB型と関連するIceberg型のマッピング

PrestoDBからIcebergへの型マッピング

PrestoDB型

Iceberg型

BOOLEAN

BOOLEAN

INTEGER

INTEGER

BIGINT

LONG

REAL

FLOAT

DOUBLE

DOUBLE

DECIMAL

DECIMAL

VARCHAR

STRING

VARBINARY

BINARY

DATE

DATE

ROW

STRUCT

ARRAY

LIST

MAP

MAP

TIME

TIME

TIMESTAMP

TIMESTAMP WITHOUT ZONE

TIMESTAMP WITH TIMEZONE

TIMESTAMP WITH ZONE

その他の型はサポートされていません。