Iceberg クライアントを使用した Delta Lake テーブルの読み取り
Databricks Runtime 14.3 LTS 以降で利用可能な Iceberg 読み取り機能は、Delta Lake テーブルを設定して Iceberg メタデータを自動的に生成するため、Iceberg クライアントはファイルを書き換えることなく Delta Lake データを読み取ることができます。
外部接続を構成して、Unity Catalog が Iceberg カタログとして機能するように設定できます。Apache Iceberg クライアントから Databricks テーブルにアクセスするを参照してください。
Iceberg 読み取りの仕組み
Delta Lake と Apache Iceberg はどちらも、Parquet データファイルとメタデータレイヤーで構成されています。Iceberg 読み取りを有効にすると、Databricks はメタデータレイヤーにユニバーサルフォーマット(UniForm)を使用するようにテーブルを構成します。UniForm は、Parquet データファイルを書き換えることなく、Delta Lake メタデータと並行して Iceberg メタデータを非同期で自動的に生成します。データファイルの 1 つのコピーで、Delta クライアントと Iceberg クライアントの両方に対応します。
Iceberg 読み取りを使用する場合は、以下を考慮してください:
- Iceberg 読み取りが有効な Delta Lake テーブルでは、基盤となる Parquet データファイルの圧縮コーデックとして、Snappy ではなく Zstandard が使用されます。
- Iceberg メタデータの生成は、Delta Lake テーブルへのデータ書き込みに使用されるコンピュート上で非同期に実行されるため、ドライバーのリソース使用量が増加する可能性があります。
レガシーな UniForm IcebergCompatV1 テーブル機能のドキュメントについては、「Legacy UniForm IcebergCompatV1」を参照してください。
要件
Iceberg 読み取りを有効にするには、次の要件を満たす必要があります:
-
Delta Lake テーブルは Unity Catalog に登録されている必要があります。マネージドテーブルと外部テーブルの両方がサポートされています。
-
テーブルでは、列マッピングが有効になっている必要があります。 Delta Lake 列マッピングを使用した列の名前変更と削除を参照してください。
- テーブルに対して
IcebergCompatV2が有効になると、columnMappingテーブル機能を削除することはできません。
- テーブルに対して
-
Delta Lake テーブルには、
minReaderVersion>= 2 およびminWriterVersion>= 7 が必要です。Delta Lake 機能の互換性とプロトコルを参照してください。 -
テーブルへの書き込みには、Databricks Runtime 14.3 LTS 以降を使用する必要があります。
Iceberg読み取りが有効になっているテーブルでは、削除ベクトルを有効にすることはできません。
削除ベクトルが有効になっている既存のテーブルで Iceberg 読み取りを有効にする際、REORG を使用して削除ベクトルを無効化およびパージします。REORG を使用した Iceberg 読み取りサポートの有効化またはアップグレードを参照してください。
Iceberg 読み取りを有効にする
Icebergの読み取りを有効にすると、IcebergCompatV2書き込みプロトコル機能が追加され、ライタープロトコルがアップグレードされます。このテーブル機能をサポートしているクライアントのみが、テーブルに書き込むことができます。これは、外部のDelta Lakeクライアントとの互換性に影響を与える可能性があります。Delta Lake 機能の互換性とプロトコルを参照してください。
Iceberg 読み取りを初めて有効にすると、非同期メタデータの生成が開始されます。 このタスクは、外部クライアントが Iceberg を使用してテーブルをクエリする前に完了する必要があります。 Iceberg メタデータの生成ステータスの確認を参照してください。
制限事項の一覧については、「制限事項」を参照してください。
テーブルの作成時
テーブル作成時にIceberg読み取りを有効にすると、列マッピングが自動的に有効になります:
CREATE TABLE T(c1 INT) TBLPROPERTIES(
'delta.columnMapping.mode' = 'id',
'delta.enableIcebergCompatV2' = 'true',
'delta.universalFormat.enabledFormats' = 'iceberg');
互換性を確保するため、Databricks では delta.columnMapping.mode = id に設定することを推奨しています。Delta Lake 列マッピングを使用した列の名前変更と削除を参照してください。
既存のテーブル上で
Databricks Runtime 15.4 LTS以降で既存のテーブルに対するIcebergの読み取りを有効にするには:
ALTER TABLE table_name SET TBLPROPERTIES(
'delta.columnMapping.mode' = 'name',
'delta.enableIcebergCompatV2' = 'true',
'delta.universalFormat.enabledFormats' = 'iceberg');
name 列マッピングモードの詳細については、列マッピングモードを参照してください。
以下を使用して Iceberg 読み取りサポートを有効化またはアップグレードします: REORG
以下のいずれかに該当する場合は、REORG を使用して Iceberg 読み取りを有効にします:
- テーブルで削除ベクトルを有効にしました。
- 以前にUniForm Icebergの
IcebergCompatV1バージョンを有効にしています。 - AthenaやRedshiftなど、Hive形式のParquetファイルをサポートしていないIcebergエンジンから読み取る必要があります。
Icebergの読み取りを有効にして基になるデータファイルを書き換えるには、次の例のように REORG を使用します:
REORG TABLE table_name APPLY (UPGRADE UNIFORM(ICEBERG_COMPAT_VERSION=2));
Iceberg 読み取りが有効になっていることを確認する
DESCRIBE EXTENDED を使用して、テーブルでIcebergの読み取りが有効になっていることを確認します:
DESCRIBE EXTENDED catalog_name.schema_name.table_name;
出力内の Delta Uniform Iceberg セクションを探してください。このセクションが存在する場合、テーブルで Iceberg 読み取りが有効になっています。
または、SHOW TBLPROPERTIESを使用することもできます:
SHOW TBLPROPERTIES catalog_name.schema_name.table_name;
次のプロパティを確認してください:
delta.enableIcebergCompatV2 = truedelta.universalFormat.enabledFormats = iceberg
両方のプロパティがこれらの値で存在する場合、Iceberg読み取りが有効になります。
Iceberg 読み取りを無効にする
delta.universalFormat.enabledFormats テーブルプロパティの設定を解除することで、Iceberg 読み取りをオフにできます:
ALTER TABLE table_name UNSET TBLPROPERTIES ('delta.universalFormat.enabledFormats');
Delta Lake のリーダーおよびライター プロトコル バージョンのアップグレードは元に戻せません。Delta Lake 機能の互換性とプロトコルを参照してください。
Iceberg メタデータの生成
Databricks は、Delta Lake の書き込みトランザクションが完了した後、非同期でメタデータ生成を Trigger します。このメタデータ生成プロセスでは、Delta Lake トランザクションを完了したのと同じコンピュートを使用します。
Iceberg メタデータの生成を手動で Trigger することもできます。Iceberg メタデータ変換を手動で Triggerを参照してください。
メタデータ生成に伴う書き込みレイテンシを回避するため、頻繁に commit が行われる Delta Lake テーブルでは、複数の Delta Lake commit を Iceberg メタデータへの単一の commit にグループ化する場合があります。
Delta Lakeは、特定のコンピュートリソース上で一度に1つのメタデータ生成プロセスのみが実行されるようにします。2つ目の並列メタデータ生成プロセスをTriggerするようなcommitは、Delta Lakeには正常にcommitされますが、非同期のIcebergメタデータ生成はTriggerされません。これにより、頻繁にcommitが発生するワークロード(commit間隔が数秒から数分)におけるメタデータ生成の連鎖的な遅延を防ぎます。
Delta および Iceberg のテーブルのバージョンを参照してください。
Delta および Iceberg のテーブルのバージョン
Delta Lake および Iceberg では、テーブルメタデータに保存されているテーブルバージョンまたは Timestamp を使用して、タイムトラベルクエリーを実行できます。
Delta Lake テーブルのバージョンは、commit の Timestamp またはバージョン ID のいずれによっても Iceberg バージョンと一致するとは限りません。特定のバージョンの Iceberg テーブルが対応する Delta Lake テーブルのバージョンを確認するには、対応するテーブル プロパティを使用します。Iceberg メタデータの生成ステータスの確認を参照してください。
Iceberg メタデータの生成ステータスの確認
テーブルで Iceberg 読み取りを有効にすると、メタデータの生成ステータスを追跡するために、以下のフィールドが Unity Catalog および Iceberg テーブルのメタデータに追加されます:
メタデータフィールド | 説明 |
|---|---|
| Icebergメタデータが正常に生成されたDelta Lakeテーブルの最新バージョン。 |
| Iceberg メタデータが正常に生成された、最新の Delta Lake commit の Timestamp。 |
Databricksでは、次のいずれかの方法でこれらのメタデータフィールドを確認できます。
DESCRIBE EXTENDED table_nameによって返されたDelta Uniform Icebergセクションをレビューしています。- カタログエクスプローラーを使用したテーブルメタデータの確認。
Databricks の外部でテーブル プロパティを確認する方法については、Iceberg リーダー クライアントのドキュメントを参照してください。OSS Apache Spark の場合、次の構文を使用してこれらのプロパティを確認できます。
SHOW TBLPROPERTIES <table-name>;
Iceberg メタデータ変換を手動で Trigger
Delta Lakeテーブルの最新バージョンに対して、Icebergメタデータの生成を手動でTriggerできます。この操作は同期的にランします。完了すると、Icebergで利用可能なテーブルコンテンツには、変換プロセスが起動された時点で利用可能だったDelta Lakeテーブルの最新バージョンが反映されます。
この操作は、通常の状態では必要ありません。以下から回復するために使用します:
- クラスターは、自動メタデータ生成が成功する前に終了します。
- エラーまたはジョブの失敗により、メタデータの生成が中断されます。
- UniForm Iceberg メタデータ生成をサポートしていないクライアントが Delta Lake テーブルに書き込みを行います。
Iceberg メタデータの生成を手動でTriggerするには、次の構文を使用します:
MSCK REPAIR TABLE <table-name> SYNC METADATA
REPAIR TABLEを参照してください。
メタデータ JSON パスを使用した Iceberg の読み取り
BigQuery などの一部の Iceberg クライアントでは、外部の Iceberg テーブルを登録するために、バージョン管理されたメタデータファイルへのパスを指定する必要があります。Databricks が Delta Lake テーブルの新しいバージョンを Iceberg に変換するたびに、新しいメタデータ JSON ファイルが作成されます。
構成の詳細については、特定の Iceberg リーダー クライアントのドキュメントを参照してください。
Delta Lake は、以下のパターンを使用して Iceberg メタデータをテーブルディレクトリ配下に格納します。
<table-path>/metadata/<version-number>-<uuid>.metadata.json
Databricks では、次のいずれかの方法でこのメタデータの場所を確認できます。
DESCRIBE EXTENDED table_nameによって返されたDelta Uniform Icebergセクションをレビューしています。- カタログエクスプローラーを使用したテーブルメタデータの確認。
パスベースのIcebergリーダークライアントでは、現在のテーブルバージョンを読み取るために、メタデータJSONパスの手動更新とリフレッシュが必要になる場合があります。VACUUMによってParquetデータファイルがDelta Lakeテーブルから削除されるため、古いバージョンを使用してIcebergテーブルをクエリすると、ユーザーがエラーに遭遇する可能性があります。
VACUUMとIcebergメタデータのクリーンアップ
Databricks Runtime 17.2 以降、VACUUM コマンドは、到達可能な Iceberg メタデータを保持したまま、UniForm metadata/ ディレクトリ配下の追跡されていないファイルを削除します。
UniForm 変換は内部的に Iceberg スナップショットの有効期限切れ処理を実行しますが、default では cleanExpiredFiles(false) を使用します。その結果、OPTIMIZE および通常の UniForm 変換では、古い Iceberg メタデータにアクセスできなくなるだけで、物理的に削除されることはありません。
到達不能な Iceberg メタデータを物理的に削除するには、delta.deletedFileRetentionDuration の保持期間が経過した後にラン FULL VACUUM を実行します。タイムトラベルクエリーのデータ保持を構成するを参照してください。
予測的最適化が有効な場合、Databricks がこのクリーンアップを自動的に処理するため、Iceberg メタデータのクリーンアップのために手動で FULL VACUUM をランする必要はありません。
制限事項
Iceberg読み取りが有効になっているすべてのテーブルには、次の制限があります。
-
Icebergクライアントのサポートは読み取り専用です。書き込みはサポートされていません。
- Databricks による Iceberg 読み取りのサポートに関係なく、Iceberg リーダークライアントには個別の制限がある場合があります。選択したクライアントのドキュメントを参照してください。
-
削除ベクトルは、Iceberg v2 の読み取りではサポートされていません。ただし、Apache Iceberg v3 は削除ベクトルをサポートしています。Apache Iceberg v3 機能の使用およびDatabricks における削除ベクトルを参照してください。
-
IcebergCompatV2を使用している場合、マテリアライズドビューまたはストリーミングテーブルで Iceberg 読み取りを有効にすることはできません。パイプライン管理のマテリアライズドビューおよびストリーミングテーブルについては、代わりにIcebergCompatV3を使用して外部 Iceberg アクセスを有効にできます。この機能は パブリック プレビュー段階です。ストリーミングテーブルおよびマテリアライズドビューへの外部データアクセスを有効にするを参照してください。 -
Iceberg メタデータの生成を自動的に Trigger するには、Delta Lake テーブルに(パスではなく)名前でアクセスする必要があります。
-
Iceberg 読み取りが有効になっている Delta Lake テーブルは、
VOID型をサポートしていません。 -
Iceberg 読み取りで使用される一部の Delta Lake テーブル機能は、一部の OpenSharing リーダークライアントではサポートされていません。OpenSharing とはを参照してください。
-
OpenSharing の受信者は、Iceberg REST Catalog API を使用して、Iceberg 読み取りが有効になっている Delta Lake テーブルを Iceberg テーブルとして読み取ることができます。この機能は パブリック プレビュー段階です。外部 Iceberg クライアントへの共有を有効にするを参照してください。
-
レガシーチェンジデータフィードは、Iceberg読み取りが有効な場合にDeltaクライアントで機能しますが、Icebergではサポートされていません。See Legacy Change Data Feed for Delta Lake.