Delta テーブルで Iceberg 読み取りを有効にする (UniForm)

この記事では、Databricks の Delta Lake に格納されたテーブルで Iceberg 読み取りを有効にする方法について詳しく説明します。 この機能には、Databricks Runtime 14.3 LTS 以降が必要です。

この機能は、以前は Delta Lake Universal Format (UniForm) と呼ばれていました。

Unity Catalog が Iceberg カタログとして機能するように外部接続を構成できます。 「 Iceberg クライアントから Databricks テーブルを読み取る」を参照してください。

Iceberg 読み取りが有効になっているテーブルでは、基になる Parquet データ ファイルの圧縮コーデックとして Snappy ではなく Zstandard が使用されます。

UniForm メタデータの生成は、Delta テーブルにデータを書き込むために使用されるコンピュートで非同期的に実行されるため、ドライバーのリソース使用量が増加する可能性があります。

重要

従来の UniForm IcebergCompatV1テーブル機能のドキュメントについては、 「Legacy UniForm IcebergCompatV1」を参照してください。

Iceberg reads(UniForm)はどのように機能しますか?

Delta Lake と Iceberg はどちらも Parquet データ ファイルとメタデータ レイヤーで構成されています。 Iceberg 読み取りを有効にすると、データを書き換えることなく Iceberg メタデータを非同期的に自動的に生成するようにテーブルが構成されるため、Iceberg クライアントは Databricks によって書き込まれた Delta テーブルを読み取ることができます。 データファイルの 1 つのコピーで、複数の形式が提供されます。

要件

Iceberg 読み取りを有効にするには、次の要件を満たす必要があります。

Iceberg 読み取りが有効になっているテーブルで削除ベクトルを有効にすることはできません。

REORG を使用して、削除ベクトルを無効にしてパージすると同時に、削除ベクトルが有効になっている既存のテーブルで Iceberg 読み取りを有効にします。REORG を使用した Iceberg 読み取りサポートの有効化またはアップグレードを参照してください。

Iceberg読み取りを有効にする (UniForm)

重要

Iceberg 読み取りを有効にすると、書き込みプロトコル機能 IcebergCompatV2 がテーブルに追加されます。 このテーブル機能をサポートするクライアントのみが、Iceberg 読み取りが有効になっているテーブルに書き込むことができます。 Databricks では、Databricks Runtime 14.3 LTS 以降を使用して、有効なテーブルに書き込む必要があります。

Iceberg の読み取りをオフにするには、 delta.universalFormat.enabledFormats table プロパティの設定を解除します。 Delta Lake リーダーおよびライター プロトコル バージョンへのアップグレードは元に戻せません。

Iceberg 読み取りを有効にするには、次のテーブル プロパティを設定する必要があります。

'delta.enableIcebergCompatV2' = 'true'
'delta.universalFormat.enabledFormats' = 'iceberg'

Icerberg 読み取りを初めて有効にすると、非同期メタデータの生成が開始されます。 このタスクは、外部クライアントが Iceberg を使用してテーブルをクエリする前に完了する必要があります。 「Iceberg メタデータの生成ステータスの確認」を参照してください。

制限事項の一覧については、「 制限事項」を参照してください。

テーブル作成中の Iceberg 読み取りを有効にする

Iceberg 読み取りを使用するには、列マッピングを有効にする必要があります。これは、次の例のように、テーブルの作成時に Iceberg 読み取りを有効にすると自動的に行われます。

CREATE TABLE T(c1 INT) TBLPROPERTIES(
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg');

既存のテーブルで Iceberg 読み取りを有効にする

Databricks Runtime 15.4 LTS 以降では、次の構文を使用して、既存のテーブルで Iceberg の読み取りを有効または無効にアップグレードできます。

ALTER TABLE table_name SET TBLPROPERTIES(
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg');

REORG を使用した Iceberg 読み取りサポートの有効化またはアップグレード

次の例のように、 REORG を使用して Iceberg の読み取りを有効にし、基になるデータ ファイルを再書き込みできます。

REORG TABLE table_name APPLY (UPGRADE UNIFORM(ICEBERG_COMPAT_VERSION=2));

次のいずれかに該当する場合は、 REORG を使用します。

  • テーブルでは削除ベクトルが有効になっています。

  • 以前に UniForm Iceberg のIcebergCompatV1バージョンを有効にしました。

  • Athena や Redshift など、Hive スタイルの Parquet ファイルをサポートしていない Iceberg エンジンから読み取る必要があります。

Iceberg メタデータの生成はいつ行われますか?

Databricks は、Delta Lake 書き込みトランザクションが完了した後に、メタデータの生成を非同期的にトリガーします。 このメタデータ生成プロセスでは、 Deltaトランザクションを完了したのと同じコンピュートが使用されます。

Iceberg メタデータの生成を手動でトリガーすることもできます。 「Iceberg メタデータ変換を手動でトリガーする」を参照してください。

メタデータ生成に関連する書き込み遅延を回避するために、頻繁にコミットされるDeltaテーブルは、複数のDeltaコミットをIcebergメタデータへの 1 つのコミットにグループ化する場合があります。

Delta Lake 、特定のコンピュート リソース上で常に 1 つのメタデータ生成プロセスだけが進行中であることを保証します。 これにより、2 番目のメタデータ生成プロセスがトリガーされ、 Deltaに正常にコミットされますが、非同期Icebergメタデータ生成はトリガーされません。 これにより、コミットが頻繁に行われるワークロード (コミット間の間隔が数秒から数分) のメタデータ生成の遅延が連鎖的に発生するのを防ぎます。

Delta および Iceberg のテーブルのバージョンを参照してください。

Delta および Iceberg テーブルのバージョン

Delta LakeとIcebergでは、テーブル メタデータに格納されているテーブル バージョンまたはタイムスタンプを使用したタイムトラベル クエリが可能です。

一般に、Delta テーブルのバージョンは、コミット タイムスタンプまたはバージョン ID のいずれによっても Iceberg バージョンと一致しません。 特定のバージョンの Iceberg テーブルがどのバージョンの Delta テーブルに対応しているかを確認するには、対応するテーブル プロパティを使用できます。 Iceberg メタデータ生成ステータスの確認を参照してください。

Iceberg メタデータの生成ステータスを確認する

テーブルで Iceberg 読み取りを有効にすると、メタデータの生成状態を追跡するために、Unity Catalog と Iceberg テーブルのメタデータに次のフィールドが追加されます。

メタデータ フィールド

説明

converted_delta_version

Iceberg メタデータが正常に生成された Delta テーブルの最新バージョン。

converted_delta_timestamp

Iceberg メタデータが正常に生成された最新の Delta コミットのタイムスタンプ。

Databricks では、次のいずれかを実行して、これらのメタデータ フィールドを確認できます。

  • DESCRIBE EXTENDED table_nameによって返されたDelta Uniform Icebergセクションを確認しています。

  • カタログ エクスプローラーを使用してテーブルのメタデータを確認します。

  • REST API を使用してテーブルを取得します

Databricks の外部でテーブルのプロパティを確認する方法については、Iceberg リーダー クライアントのドキュメントを参照してください。 OSS Apache Sparkの場合、次の構文を使用してこれらのプロパティを表示できます。

SHOW TBLPROPERTIES <table-name>;

Iceberg メタデータ変換を手動でトリガーする

最新バージョンの Delta テーブルの Iceberg メタデータ生成を手動でトリガーできます。 この操作は同期的に実行されるため、完了すると、Iceberg で使用可能なテーブルの内容に、変換プロセスの開始時に使用可能な Delta テーブルの最新バージョンが反映されます。

この操作は、通常の状態では必要ありませんが、次の場合に役立ちます。

  • 自動メタデータ生成が成功する前にクラスターが終了します。

  • エラーまたはジョブの失敗により、メタデータの生成が中断されます。

  • UniForm Iceberg メタデータ グレレーションをサポートしていないクライアントは、Delta テーブルに書き込みます。

次の構文を使用して、Iceberg メタデータの生成を手動でトリガーします。

MSCK REPAIR TABLE <table-name> SYNC METADATA

修復テーブルを参照してください。

メタデータ JSON パスを使用した Icerberg の読み取り

一部の Iceberg クライアントでは、外部の Iceberg テーブルを登録するために、バージョン管理されたメタデータ ファイルへのパスを指定する必要があります。 Databricks は、新しいバージョンの Delta テーブルを Iceberg に変換するたびに、新しいメタデータ JSON ファイルを作成します。

Iceberg の設定にメタデータ JSON パスを使用するクライアントには、BigQuery が含まれます。 構成の詳細については、Iceberg リーダー クライアントのドキュメントを参照してください。

Delta Lake は、次のパターンを使用して、テーブル ディレクトリの下に Iceberg メタデータを格納します。

<table-path>/metadata/<version-number>-<uuid>.metadata.json

Databricks では、次のいずれかを実行して、このメタデータの場所を確認できます。

  • DESCRIBE EXTENDED table_nameによって返されたDelta Uniform Icebergセクションを確認しています。

  • カタログ エクスプローラーを使用してテーブルのメタデータを確認します。

  • REST API で次のコマンドを使用します。

GET api/2.1/unity-catalog/tables/<catalog-name>.<schame-name>.<table-name>

応答には、次の情報が含まれます。

{
    ...
          "delta_uniform_iceberg": {
              "metadata_location":  "<cloud-storage-uri>/metadata/v<version-number>-<uuid>.metadata.json"
    }
}

重要

パスベースの Iceberg リーダー クライアントでは、現在のテーブル バージョンを読み取るために、メタデータ JSON パスを手動で更新および更新する必要がある場合があります。 古いバージョンを使用して Iceberg テーブルをクエリすると、Parquet データ ファイルが VACUUMを使用して Delta テーブルから削除されるため、エラーが発生することがあります。

制限

Iceberg 読み取りが有効になっているすべてのテーブルには、次の制限があります。

  • Iceberg 読み取りは、削除ベクトルが有効になっているテーブルでは機能しません。 削除ベクトルとはを参照してください

  • DeltaIceberg読み込みが有効になっているVOID テーブルは、 タイプをサポートしていません。

  • Iceberg クライアントのサポートは読み取り専用です。 書き込みはサポートされていません。

  • Iceberg リーダー クライアントには、Databricks が Iceberg 読み取りをサポートしているかどうかに関係なく、個別の制限がある場合があります。 選択したクライアントのドキュメントを参照してください。

  • Delta Sharing の受信者は、Iceberg 読み取りが有効になっている場合でも、テーブルを Delta としてのみ読み取ることができます。

  • Iceberg 読み取りで使用される一部の Delta Lake テーブル機能は、一部の Delta Sharing リーダー クライアントではサポートされていません。 「Delta Sharing とは」を参照してください。

チェンジデータフィードは、Delta Iceberg読み取りが有効になっている場合は クライアントで機能しますが、Iceberg ではサポートされていません。