Databricks Runtime 14.3 LTS以降で利用可能で、IcebergはDelta Lakeテーブルを読み込み設定して自動的にIcebergメタデータを生成します。これにより、Icebergクライアントはファイルを書き換えずにDelta Lakeデータを読み取ることができます。
Unity Catalog が Iceberg カタログとして機能するように外部接続を構成することが可能です。 Apache Iceberg クライアントからの Azure Databricks テーブルへのアクセスに関するページを参照してください。
Iceberg がデータを読み取る仕組み
Delta Lake と Apache Iceberg はどちらも Parquet データ ファイルとメタデータ レイヤーで構成されます。 Iceberg読み取りを有効にすると、Azure DatabricksはメタデータレイヤーにUniversal Format(UniForm)を使うようにテーブルを設定します。 UniFormはParquetのデータファイルを書き換えることなく、Delta Lakeのメタデータと非同期で自動的にIcebergメタデータを生成します。 データファイルの1つのコピーでDeltaとIcebergの両方のクライアントをサポートします。
Iceberg 読み取りを使用する場合は、次の点を考慮してください。
- Iceberg 読み取りが有効になっている Delta Lake テーブルでは、基になる Parquet データ ファイルの圧縮コーデックとして Snappy の代わりに Zstandard が使用されます。
- Iceberg メタデータの生成は、Delta Lake テーブルにデータを書き込むためのコンピューティングで非同期的に実行されるため、ドライバー リソースの使用量が増加する可能性があります。
従来の UniForm IcebergCompatV1 テーブル機能のドキュメントについては、「 レガシ UniForm IcebergCompatV1」を参照してください。
要件
Iceberg 読み取りを有効にするには、次の要件を満たす必要があります。
- Delta Lake テーブルを Unity カタログに登録する必要があります。 また、マネージド テーブルと外部テーブルの両方がサポートされている必要があります。
- テーブルで列マッピングが有効になっている必要があります。
「Delta Lake 列マッピングを使用して列の名前を変更および削除する」を参照してください。
- テーブル
IcebergCompatV2有効にすると、columnMappingテーブル機能を削除することはできません。
- テーブル
- Delta Lake テーブルには、
minReaderVersion>= 2 とminWriterVersion>= 7 が必要です。 Delta Lake の機能の互換性とプロトコルに関する記事を参照してください。 - テーブルへの書き込みには、Databricks Runtime 14.3 LTS 以降を使用する必要があります。
Note
Iceberg 読み取りが有効になっているテーブルで削除ベクトルを有効にすることはできません。
削除ベクトルが有効になっている既存のテーブルで Iceberg の読み取りを有効にするときに、 REORG を使用して削除ベクターをオフおよび消去します。 「REORGを使用して Iceberg 読み取りのサポートを有効化またはアップグレードする」を参照してください。
Iceberg読み取りを有効にする
Note
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列マッピング モードの詳細については、「列マッピング モード」を参照してください。
REORG を使用して Iceberg 読み取りのサポートを有効化またはアップグレードする
次のいずれかに該当する場合は、 REORG を使用して Iceberg 読み取りを有効にします。
- テーブルで削除ベクトルを有効にしました。
- 以前に UniForm Iceberg の
IcebergCompatV1バージョンを有効化した。 - Hive スタイルの Parquet ファイル (アテナや Redshift など) をサポートしていない 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 の読み取りをオフにする
iceberg の読み取りをオフにするには、 delta.universalFormat.enabledFormats テーブル プロパティを設定解除します。
ALTER TABLE table_name UNSET TBLPROPERTIES ('delta.universalFormat.enabledFormats');
Delta Lake リーダーおよびライター プロトコル バージョンへのアップグレードを元に戻すことはできません。 Delta Lake の機能の互換性とプロトコルに関する記事を参照してください。
Iceberg メタデータの生成
Azure Databricks は、Delta Lake 書き込みトランザクションが完了した後、メタデータの生成を非同期的にトリガーします。 このメタデータ生成プロセスでは、Delta Lake トランザクションを完了したのと同じコンピューティングが使用されます。
Iceberg メタデータの生成を手動でトリガーすることもできます。 「Iceberg メタデータの変換を手動でトリガーする」を参照してください。
メタデータの生成に関連する書き込みの待機時間を回避するために、頻繁にコミットされる Delta Lake テーブルでは、複数の Delta Lake コミットが Iceberg メタデータへの 1 つのコミットにグループ化される場合があります。
Delta Lake では、特定のコンピューティング リソースで、1 つのメタデータ生成プロセスのみが進行中であることが保証されます。 2 番目の同時メタデータ生成プロセスをトリガーするコミットは、Delta Lake に正常にコミットしますが、非同期 Iceberg メタデータ生成はトリガーしません。 これにより、頻繁にコミットされるワークロード (各コミット間の時間は数秒から数分) におけるメタデータ生成の多段的な待機時間を回避します。
「Delta テーブルと Iceberg テーブルのバージョン」を参照してください。
Delta テーブルと Iceberg テーブルのバージョン
Delta Lake と Iceberg では、テーブル メタデータに保存されているテーブル バージョンまたはタイムスタンプを使用して、タイム トラベル クエリを実行できます。
Delta Lake テーブルのバージョンは、コミット タイムスタンプまたはバージョン ID によって Iceberg のバージョンと一致することは保証されません。 Iceberg テーブルの特定のバージョンが対応する Delta Lake テーブルのバージョンを確認するには、対応するテーブルプロパティを使用します。 「Iceberg メタデータの生成状態を確認する」を参照してください。
Iceberg メタデータの生成状態を確認する
テーブルで Iceberg 読み取りを有効にすると、メタデータの生成状態を追跡するために、Unity Catalog と Iceberg テーブルのメタデータに次のフィールドが追加されます。
| メタデータ フィールド | Description |
|---|---|
converted_delta_version |
Iceberg メタデータが正常に生成された Delta Lake テーブルの最新バージョン。 |
converted_delta_timestamp |
Iceberg メタデータが正常に生成された最新の Delta Lake コミットのタイムスタンプ。 |
Azure Databricks では、次のいずれかの方法で、これらのメタデータ フィールドを確認できます。
-
Delta Uniform Icebergによって返されるDESCRIBE EXTENDED table_nameセクションの確認。 - カタログ エクスプローラーでのテーブル メタデータの確認。
Azure Databricks の外部でテーブルのプロパティを確認する方法については、Iceberg リーダー クライアントのドキュメントを参照してください。 OSS Apache Spark の場合は、次の構文を使用してこれらのプロパティを確認できます。
SHOW TBLPROPERTIES <table-name>;
Iceberg メタデータの変換を手動でトリガーする
最新バージョンの Delta Lake テーブルに対して Iceberg メタデータ生成を手動でトリガーできます。 この操作は同期的に実行されます。 完了すると、Iceberg で使用できるテーブルの内容には、変換プロセスの開始時に使用可能な Delta Lake テーブルの最新バージョンが反映されます。
この操作は、通常の条件下では必要ありません。 これを使って、次の状態から復旧できます。
- メタデータの自動生成が成功する前にクラスターが終了する。
- エラーまたはジョブの失敗によってメタデータの生成が中断される。
- UniForm Iceberg メタデータ生成をサポートしていないクライアントは、Delta Lake テーブルへの書き込みを行います。
Iceberg メタデータの生成を手動でトリガーするには、次の構文を使用します。
MSCK REPAIR TABLE <table-name> SYNC METADATA
REPAIR TABLEを参照してください。
メタデータ JSON パスを使用して Iceberg を読み取る
BigQuery などの一部の Iceberg クライアントでは、外部 Iceberg テーブルを登録するために、バージョン管理されたメタデータ ファイルへのパスを指定する必要があります。 Azure Databricks が Delta Lake テーブルの新しいバージョンを Iceberg に変換するたびに、新しいメタデータ JSON ファイルが作成されます。
構成の詳細については、特定の Iceberg リーダー クライアントのドキュメントを参照してください。
Delta Lake では、次のパターンを使用して、Iceberg メタデータをテーブル ディレクトリの下に保存します。
<table-path>/metadata/<version-number>-<uuid>.metadata.json
Azure Databricks では、次のいずれかの方法で、このメタデータの場所を確認できます。
-
Delta Uniform Icebergによって返されるDESCRIBE EXTENDED table_nameセクションの確認。 - カタログ エクスプローラーでのテーブル メタデータの確認。
Important
パスベースの Iceberg リーダー クライアントでは、現在のテーブル バージョンを読み取るために、メタデータ JSON パスの手動でのアップデートおよび更新が必要になる場合があります。 ParquetのデータファイルがDelta Lakeテーブルから VACUUMで削除されるため、古いバージョンでIcebergテーブルを照会するとエラーが発生することがあります。
VACUUMと Iceberg メタデータのクリーンアップを参照してください。
VACUUM および Iceberg メタデータのクリーンアップ
Iceberg読み取りが有効なDelta Lakeテーブルでは、テーブルが変更されるにつれてIcebergメタデータが metadata/ ディレクトリに蓄積されます。
OPTIMIZE また、Iceberg操作への変換は古いテーブルバージョンのメタデータを削除しません。 それを取り除くのは VACUUM だけです。
Databricks Runtime 17.2以降で利用可能で、 VACUUM は metadata/ ディレクトリ内の追跡されていないファイルを削除しつつ、クライアントが現在のテーブルバージョンを読み取るために必要なIcebergメタデータを保持します。 このクリーンアップは FULL モードで動作し、 VACUUMのデフォルトモードです。
古いテーブルバージョンのメタデータをクリーンアップするには、delta.deletedFileRetentionDuration保持期間が経過した後にVACUUMを実行します:
VACUUM table_name FULL
真空モードについては 「フルとライトモード 」、保持期間については「 タイムトラベルクエリのためのデータ保持設定 」を参照してください。
予測最適化が有効であれば、Databricksが自動的にこのクリーンアップを処理するため、Icebergのメタデータクリーンアップのために手動でVACUUMを実行する必要はありません。
制限事項
Iceberg 読み取りが有効になっているすべてのテーブルには、次の制限事項があります。
- Iceberg クライアントのサポートは読み取り専用です。 書き込みはサポートされていません。
- Azure Databricks による Iceberg 読み取りのサポートに関係なく、Iceberg リーダー クライアントには個別の制限がある場合があります。 選択したクライアントのドキュメントを参照してください。
- Iceberg v2 の読み取りでは、削除ベクターはサポートされていません。 ただし、Apache Iceberg v3 では削除ベクターがサポートされています。 Databricks でのApache Iceberg v3 の機能と削除ベクトルの使用を参照してください。
-
IcebergCompatV2を使用して、マテリアライズドビューまたはストリーミング テーブルで Iceberg の読み取りを有効にすることはできません。 パイプライン管理のマテリアライズドビューやストリーミングテーブルでは、IcebergCompatV3を使って外部Icebergアクセスを有効にすることができます。 ストリーミング テーブルと具体化されたビューへの外部データ アクセスを有効にするを参照してください。 - Iceberg メタデータの生成を自動的にトリガーするには、Delta Lake テーブルに (パスではなく) 名前でアクセスする必要があります。
- Iceberg 読み取りが有効になっている Delta Lake テーブルでは、
VOID型はサポートされていません。 - Iceberg 読み取りで使用される一部の Delta Lake テーブル機能は、一部の OpenSharing リーダー クライアントではサポートされていません。 OpenSharing とはを参照してください。
- OpenSharing の受信者は、Iceberg REST Catalog API を使用して Iceberg テーブルとして Iceberg 読み取りを有効にして Delta Lake テーブルを読み取ることができます。 この機能は パブリック プレビュー段階です。 「外部 Iceberg クライアントへの共有を有効にする」を参照してください。
- 従来の変更データ フィードは、Iceberg 読み取りが有効になっているが Iceberg でサポートされていない場合に Delta クライアントで機能します。 Delta Lake のレガシ変更データ フィードを参照してください。