UniFormを使用して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読み取りを有効にすると、Delta Lakeテーブルは、データを書き換えることなく、Icebergメタデータを非同期で自動的に生成するように構成され、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 読み取りが有効になっているテーブルで削除ベクトルを有効にすることはできません。
REORG を使用して、削除ベクトルが有効になっている既存のテーブルで Iceberg 読み取りを有効にしながら、削除ベクトルをオフにしてパージします。「REORG を使用して Iceberg 読み取りサポートを有効にするかアップグレードする」を参照してください。
Iceberg読み取りを有効にする (UniForm)
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 読み取り (UniForm) が有効になっていることを確認します。
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 の書き込みトランザクションが完了した後、非同期でメタデータ生成を開始します。このメタデータ生成プロセスは、Delta Lake トランザクションを完了したのと同じコンピュートを使用します。
Iceberg メタデータの生成を手動でトリガーすることもできます。 「 Iceberg メタデータ変換を手動でトリガーする」を参照してください。
メタデータ生成に伴う書き込みレイテンシーを回避するため、頻繁なコミットを伴うDelta Lakeテーブルは、複数のDelta LakeコミットをIcebergメタデータへの単一のコミットにグループ化する場合があります。
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 テーブルのメタデータに次のフィールドが追加されます。
メタデータフィールド | 説明 |
|---|---|
| Iceberg メタデータが正常に生成された Delta Lake テーブルの最新バージョン。 |
| Icebergメタデータが正常に生成された最新のDelta Lakeコミットのタイムスタンプ。 |
Databricks では、次のいずれかの操作を行って、これらのメタデータ フィールドを確認できます。
DESCRIBE EXTENDED table_nameによって返されたDelta Uniform Icebergセクションを確認します。- カタログエクスプローラーでテーブルのメタデータを確認しています。
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テーブルを登録するために、バージョン管理されたメタデータファイルへのパスを提供する必要があります。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パスを手動で更新および最新の状態にすることが必要となる場合があります。古いバージョンを使用してIcebergテーブルをクエリする際に、ParquetデータファイルがVACUUMでDelta Lakeテーブルから削除されるため、ユーザーはエラーに遭遇する可能性があります。
制限
Iceberg 読み取りが有効になっているすべてのテーブルには、次の制限があります。
-
Iceberg クライアントのサポートは読み取り専用です。 書き込みはサポートされていません。
- Iceberg リーダー クライアントには、Databricks が Iceberg 読み取りをサポートしているかどうかに関係なく、個別の制限がある場合があります。 選択したクライアントのドキュメントを参照してください。
-
削除ベクトルはIceberg v2の読み取りではサポートされていません。ただし、Apache Iceberg v3は削除ベクトルをサポートしています。「Apache Iceberg v3の機能を使用する」および「Databricksの削除ベクトル」を参照してください。
-
マテリアライズドビューまたはストリーミングテーブルでは、Iceberg読み取りを有効にできません。
-
Icebergメタデータの生成を自動的にトリガーするには、Delta Lakeテーブルに名前で(パスではなく)アクセスする必要があります。
-
Iceberg読み取りが有効なDelta Lakeテーブルは、
VOIDタイプをサポートしていません。 -
Icebergの読み取りで使用される一部のDelta Lakeテーブル機能は、一部のOpenSharingリーダークライアントではサポートされていません。「オープン共有とは何ですか?」をご覧ください。
-
OpenSharing の受信者は、Iceberg の読み取りが有効になっている Delta Lake テーブルを、Iceberg REST Catalog API を使用して Iceberg テーブルとして読み取ることができます。この機能は パブリック プレビュー段階です。外部 Iceberg クライアントへの共有を有効にするを参照してください。
-
レガシーチェンジデータフィードは、Icebergの読み取りが有効になっている場合にDeltaクライアントで機能しますが、Icebergではサポートされていません。See Legacy change data feed for Delta Lake.