メインコンテンツまでスキップ

Iceberg クライアントを使用した Delta テーブルの読み取り

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

注記

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

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

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

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

important
  • Iceberg 読み取りが有効になっているテーブルでは、基になる Parquet データ ファイルの圧縮コーデックとして Snappy ではなく Zstandard が使用されます。
  • Iceberg メタデータの生成は、 Delta テーブルにデータを書き込むために使用されるコンピュートで非同期的に実行されるため、ドライバー リソースの使用量が増加する可能性があります。
  • 従来の UniForm IcebergCompatV1 テーブル機能のドキュメントについては、「 従来の UniForm IcebergCompatV1」を参照してください。

必要条件

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

  • Delta テーブルは Unity Catalog に登録する必要があります。 管理テーブルと外部テーブルの両方がサポートされています。
  • テーブルでは、列マッピングが有効になっている必要があります。 「Delta Lake 列マッピングを使用した列の名前変更と削除」を参照してください。
  • Delta テーブルには、 minReaderVersion >= 2 と minWriterVersion >= 7 が必要です。 「Delta Lake 機能の互換性とプロトコル」を参照してください。
  • テーブルへの書き込みには、Databricks Runtime 14.3 LTS 以降を使用する必要があります。
注記

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

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

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

important

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

IcebergCompatV2 列マッピングによって異なります。 テーブルに対して IcebergCompatV2 を有効にすると、 columnMapping テーブル機能を削除することはできません。

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

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

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

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

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

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

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

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

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

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

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

Iceberg 読み取りサポートを有効化またはアップグレードするには、 REORG

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

SQL
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 コミットを 1 つのコミットにまとめてメタデータ Iceberg 場合があります。

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 の場合、これらのプロパティは次の構文を使用して表示できます。

SQL
SHOW TBLPROPERTIES <table-name>;

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

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

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

  • クラスターは、自動メタデータ生成が成功する前に終了します。
  • エラーまたはジョブの失敗により、メタデータの生成が中断されます。
  • UniForm Iceberg メタデータ生成をサポートしていないクライアントは、Delta テーブルに書き込みます。

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

SQL
MSCK REPAIR TABLE <table-name> SYNC METADATA

REPAIR TABLEを参照してください。

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

一部の 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"
}
}
important

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

制限

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

  • Iceberg 読み取りは、削除ベクトルが有効になっているテーブルでは機能しません。 削除ベクトルとはを参照してください
  • Iceberg 読み取りは、マテリアライズドビューまたはストリーミングテーブルでは有効にできません。
  • DeltaIceberg読み込みが有効になっているVOID テーブルは、 タイプをサポートしていません。
  • Iceberg クライアントのサポートは読み取り専用です。 書き込みはサポートされていません。
  • Iceberg リーダー クライアントには、Databricks が Iceberg 読み取りをサポートしているかどうかに関係なく、個別の制限がある場合があります。 選択したクライアントのドキュメントを参照してください。
  • Delta Sharing の受信者は、Iceberg 読み取りが有効になっている場合でも、テーブルを Delta としてのみ読み取ることができます。
  • Iceberg 読み取りで使用される一部の Delta Lake テーブル機能は、一部の Delta Sharing リーダー クライアントではサポートされていません。 「Delta Sharing とは」を参照してください。

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