テーブルの作成
エンジン引数
S3、AzureBlobStorage、HDFS、File エンジンの引数の説明に対応しています。
format は、Icebergテーブル内のデータファイルのフォーマットを表します。
IcebergS3 では、オプションの extra_credentials パラメータを使用して、ClickHouse Cloud でロールベースアクセスを行うための role_arn を渡すことができます。設定手順については、Secure S3 を参照してください。
エンジンパラメータは、Named Collections を使用して指定できます
例
別名
Iceberg は IcebergS3 の別名です。
データ型
基本データ型
| Iceberg 型 | ClickHouse 型 | 注記 |
|---|---|---|
boolean | Bool | |
int | Int32 | |
long, bigint | Int64 | |
float | Float32 | |
double | Float64 | |
date | Date32 | |
time | Int64 | 午前0時からのマイクロ秒数 |
timestamp | DateTime64(6) | マイクロ秒、タイムゾーンなし |
timestamptz | DateTime64(6, 'UTC') | マイクロ秒、UTC タイムゾーン |
timestamp_ns | DateTime64(9) | ナノ秒、タイムゾーンなし (Iceberg v3 以降のみ) |
timestamptz_ns | DateTime64(9, 'UTC') | ナノ秒、UTC タイムゾーン (Iceberg v3 以降のみ) |
string, binary | String | |
uuid | UUID | |
fixed(N) | FixedString(N) | |
decimal(P, S) | Decimal(P, S) |
複雑な型
| Iceberg 型 | ClickHouse 型 |
|---|---|
list | Array |
map | Map |
struct | Tuple |
スキーマの進化
- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
パーティションプルーニング
use_iceberg_partition_pruning = 1 を設定します。Iceberg のパーティションプルーニングの詳細については、https://iceberg.apache.org/spec/#partitioning を参照してください
タイムトラベル
削除された行があるテーブルの処理
- 削除ベクトル (v3 で導入)
基本的な使い方
iceberg_timestamp_ms パラメータと iceberg_snapshot_id パラメータを同時に指定することはできません。
重要な注意点
-
スナップショット は通常、次の場合に作成されます:
- 新しいデータがテーブルに書き込まれたとき
- 何らかのデータのコンパクションが実行されたとき
- スキーマ変更では通常、スナップショットは作成されません - このため、スキーマ進化を経たテーブルでタイムトラベルを使用する場合には、重要な挙動の違いが生じます。
シナリオ例
シナリオ 1: 新しいスナップショットがない場合のスキーマ変更
- ts1 と ts2: 元の 2 つのカラムのみが表示されます
- ts3: 3 つのカラムすべてが表示され、最初の行の price は NULL になります
シナリオ 2: 過去と現在のスキーマの違い
ALTER TABLE では新しいスナップショットが作成されず、現在のテーブルについては Spark がスナップショットではなく最新のメタデータファイルから schema_id の値を取得するためです。
シナリオ 3: 過去のスキーマと現在のスキーマの違い
メタデータファイルの解決
Iceberg テーブルエンジンを使用する場合、システムは Iceberg テーブルの構造を記述した適切な metadata.json ファイルを特定する必要があります。この解決処理は、次のように行われます。
候補の検索
- パスの直接指定:
iceberg_metadata_file_pathを設定すると、システムはこの値を Iceberg テーブル の directory path と組み合わせて、その正確な path を使用します。- この設定が指定されている場合、他のすべての解決設定は無視されます。
- table UUID の照合:
iceberg_metadata_table_uuidが指定されている場合、システムは次のように動作します:metadatadirectory 内の.metadata.jsonファイルのみを対象にします- 指定した UUID と一致する
table-uuidフィールドを含むファイルに絞り込みます (大文字と小文字は区別しません)
- デフォルトの検索:
- 上記のどちらの設定も指定されていない場合、
metadatadirectory 内のすべての.metadata.jsonファイルが候補になります
最新のファイルの選択
-
iceberg_recent_metadata_file_by_last_updated_ms_fieldが有効な場合:last-updated-msの値が最も大きいファイルが選択されます
-
それ以外の場合:
- バージョン番号が最も大きいファイルが選択されます
- (バージョンは、
V.metadata.jsonまたはV-uuid.metadata.json形式のファイル名ではVとして表されます)
Iceberg テーブルエンジンは S3 に保存されたファイルを Icebergテーブルとして直接解釈するため、これらの解決ルールを理解しておくことが重要です。
データキャッシュ
Iceberg テーブルエンジンおよびテーブル関数は、S3、AzureBlobStorage、HDFS ストレージと同様にデータキャッシュをサポートしています。こちらを参照してください。
メタデータキャッシュ
Iceberg テーブルエンジンとテーブル関数は、マニフェストファイル、マニフェストリスト、metadata JSON の情報を保存するメタデータキャッシュをサポートしています。キャッシュはメモリ上に保存されます。この機能は設定 use_iceberg_metadata_files_cache で制御されており、デフォルトで有効です。
非同期メタデータプリフェッチ
iceberg_metadata_async_prefetch_period_ms を設定することで、Iceberg テーブルの作成時に有効化できます。0 (デフォルト) に設定されている場合、またはメタデータキャッシュが有効になっていない場合は、非同期プリフェッチは無効になります。
この機能を有効にするには、0 以外のミリ秒単位の値を指定する必要があります。これは、プリフェッチサイクル間の間隔を表します。
有効にすると、サーバーはリモートのカタログを定期的に確認し、新しいメタデータバージョンを検出するバックグラウンド処理を実行します。続いてそれを解析し、スナップショットを再帰的にたどりながら、アクティブなマニフェストリストファイルとマニフェストファイルを取得します。
メタデータキャッシュにすでにあるファイルは、再度ダウンロードされません。各プリフェッチサイクルの終了時点で、最新のメタデータスナップショットがメタデータキャッシュで利用可能になります。
iceberg_metadata_staleness_ms パラメータをクエリまたはセッションのパラメータとして指定する必要があります。デフォルトでは (0 - 未指定) 、各クエリのコンテキストで、サーバーはリモートカタログから最新のメタデータを取得します。
メタデータの古さに対する許容値を指定すると、サーバーはリモートカタログにアクセスせずに、キャッシュされたメタデータスナップショットを使用できるようになります。cache にメタデータのバージョンがあり、それが指定した古さの window 内にダウンロードされていれば、そのバージョンがクエリの処理に使用されます。
そうでない場合は、リモートカタログから最新バージョンが取得されます。
ICEBERG_SCEDULE_POOL で実行されます。これは、アクティブな Iceberg テーブルに対するバックグラウンド処理用のサーバー側 threadpool です。この threadpool のサイズは、iceberg_background_schedule_pool_size サーバー設定パラメータ (デフォルトは 10) で制御されます。
注記: 現時点では、非同期先読みが有効な場合、メタデータキャッシュのサイズは、すべてのアクティブなテーブルの最新のメタデータスナップショット全体を保持できるだけ十分であることが想定されています。