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を参照してください。 [[ ## completed ##]]
メタデータ生成に伴う書き込みレイテンシを回避するため、頻繁に 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 バージョンと一致するとは限りません。 [[ ## completed ##]]特定のバージョンの Iceberg テーブルが対応する Delta Lake テーブルのバージョンを確認するには、対応するテーブル プロパティを使用します。Iceberg メタデータの生成ステータスの確認を参照してください。
Iceberg メタデータの生成ステータスの確認
テーブルで Iceberg 読み取りを有効にすると、メタデータの生成ステータスを追跡するために、以下のフィールドが Unity Catalog および Iceberg テーブルのメタデータに追加されます:
メタデータフィールド | 説明 |
|---|---|
| Icebergメタデータが正常に生成されたDelta Lakeテーブルの最新バージョン。 |
| Iceberg メタデータが正常に生成された、最新の Delta Lake commit の Timestamp。 [[ ## completed ##]] |
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するには、次の構文を使用します: [[ ## completed ##]]
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) を使用します。
[[ ## completed ##]]その結果、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.