Delta Lake と Apache Iceberg の Unity カタログ マネージド テーブル

Unity カタログのマネージド テーブルは、Delta Lake と Apache Iceberg のAzure Databricksの既定の推奨されるテーブルの種類です。 Unity カタログは、すべての読み取り、書き込み、ストレージ、最適化の責任を管理します。 外部または foreign の Delta Lake テーブルを Unity Catalog のマネージドテーブルに変換するを参照してください。

マネージド テーブルのデータ ファイルは、それらを含むスキーマまたはカタログに格納されます。 「Unity Catalog の管理されたストレージの場所の指定」を参照してください。

外部テーブルおよび外来テーブルと比べて、マネージドテーブルは保存やクエリのコストが低く、自動的に保守および最適化され、オープン API を通じて外部クライアントから引き続きアクセスできます。

Azure Databricks でサポートされているすべての言語と製品でマネージド テーブルを操作できます。 マネージド テーブルの作成、更新、削除、クエリを実行するには、特定の権限が必要です。 「Unity Catalog の特権の管理」を参照してください。

Note

このページでは、Unity カタログのマネージド テーブルについてのみ説明します。 レガシ Hive メタストアのマネージド テーブルについては、レガシ Hive メタストアのデータベース オブジェクトに関する説明を参照してください。

Unity カタログのマネージド テーブルの利点

Unity カタログマネージド テーブルは、ストレージ コストとクエリ速度を最適化し、Delta Lake と Apache Iceberg 用のサードパーティ製ツールとの相互運用性を実現します。 これらのマネージド テーブルでは、データの管理とパフォーマンスを簡素化するために、ファイル サイズの圧縮やインテリジェントな統計収集などの AI を利用したテクノロジが使用されます。

マネージド テーブルでは、Delta Lake クライアントと Apache Iceberg クライアントからのアクセスを許可することで、相互運用性がサポートされます。 外部システム を使用して Databricks データにアクセスするを参照してください。

次の機能は Unity カタログのマネージド テーブルに固有の機能であり、外部テーブルと外部テーブルでは使用できません。

Feature Benefits コンフィギュレーション
カタログのコミット テーブル間の 多文トランザクション 、クエリ計画の高速化、スキーマや制約の変更の強制可能、外部エンジンからの安全な書き込みを可能にします。 既定ではオフになっています。 有効にするには、 delta.feature.catalogManaged table プロパティを設定します。 カタログコミットを有効にするを参照してください。
予測最適化 手動のメンテナンス作業を不要に、AIを用いてデータレイアウトと計算を自動的に最適化します。 Databricks では、ストレージとコンピューティングのコストを削減するために、すべてのマネージド テーブルに対して予測最適化を有効にすることをお勧めします。 2024年11月11日以降に作成されたアカウントでデフォルトで有効化されています。 Azure Databricksは既存のアカウントで徐々にこの機能を有効化しています。 構成するには、「 予測最適化を有効にする」を参照してください。
複数ステートメントトランザクション 複数のSQL文を1つ以上のテーブルにまたがって、ACID保証付きの単一のアトミックコミットとして実行します。 すべての変更は一緒に成功するか、一緒にロールバックされるかします。 ストアドプロシージャSQLスクリプトに利用。 既定ではオフになっています。 トランザクションモードを選択するには 、「トランザクションモード」を参照してください。
管理されたApache Icebergテーブルへの書き込みは プライベートプレビューにあります。
自動液体クラスタリング 予測最適化付きのテーブルでは、クエリパターンの変化に応じてクラスタリングキーを自動的に選択・更新し、パフォーマンスを向上させコスト削減します。 既定ではオフになっています。 構成するには、「 液体クラスタリングを有効にする」を参照してください。
メタデータ キャッシュ トランザクションメタデータのメモリキャッシュは、クラウドに保存されたトランザクションログへのリクエストを最小限に抑えることでクエリ性能を向上させます。 既定で有効になっています。 構成できません。
フルテキスト検索インデックス search関数とisearch関数を使用して、テキスト列の部分文字列とキーワードの検索を高速化します。 Azure Databricksは、一致する行を含めないファイルをスキップするため、スキャンされるデータ量を減らします。 既定ではオフになっています。 CREATE SEARCH INDEXを使用して作成します。
ベータ版です。 Databricks Runtime 18.2以上が必要です。
DROP TABLE コマンドの後のファイルの自動削除 管理されたテーブルを落とすと、Azure Databricksは復旧期間(デフォルトは7日)終了後にクラウドストレージのデータファイルを削除し、ストレージコストを削減します。 外部テーブルの場合は、ストレージ バケットからファイルを手動で削除する必要があります。 既定で有効になっています。 復旧期間は、カタログ レベルまたはスキーマ レベルで構成できます。 「マネージド テーブルを削除する」を参照してください。

外部システムを使用して Databricks データにアクセスする

マネージド テーブルでは、Delta Lake クライアントと Apache Iceberg クライアントからのアクセスを許可することで 、相互運用性 がサポートされます。

オープン API と資格情報の自動販売機を通じて、Unity Catalog を使用すると、Trino、DuckDB、Apache Spark、Daft、Iceberg REST カタログ統合エンジン (Dremio など) などの外部エンジンがマネージド テーブルにアクセスできるようになります。 オープン API をサポートしていない外部クライアントの場合は、 互換性モード を使用して、Delta Lake または Apache Iceberg クライアントを使用してマネージド テーブルを読み取ることができます。 オープンソース プロトコルである OpenSharing を使用すると、外部パートナーやプラットフォームとのセキュリティで保護された管理されたデータ共有が可能になります。

サポートされている外部エンジンの一覧については 統合 を参照するか、この一覧に含まれていない場合はエンジンのドキュメントを確認してください。

次のオープン API を使用すると、外部システムは Unity カタログのマネージド テーブルにアクセスできます。

  • Unity REST API には、マネージド Delta Lake テーブルへの Delta Lake クライアントの読み取り、書き込み、作成アクセス権があります。
  • Iceberg REST Catalog(IRC)は 、Apache Icebergクライアントに対して管理されたApache Icebergテーブルへの読み書き・作成アクセス権を持ち、Apache Iceberg読み取りを有効にしたDelta Lakeテーブルへの読み取り専用アクセスも可能です。

どちらの API も 資格情報の自動販売機をサポートしています。この資格情報は、要求元の Azure Databricks プリンシパルの特権を継承し、ガバナンスとセキュリティ制御を維持する一時的なスコープ付き資格情報を提供します。

OpenSharing は、外部パートナーやプラットフォームへのセキュリティで保護された管理されたデータ アクセスを可能にするオープンソース プロトコルです。 OpenSharing を使用して、パートナーに一時的な読み取り専用アクセス権を付与できます。

マネージドテーブルへのすべての読み取りと書き込みは、存在する場合、テーブル名、カタログ名、およびスキーマ名を使用しなければなりません。 たとえば、「 catalog_name.schema_name.table_name 」のように入力します。 Unity カタログのアクセス制御がバイパスされ、マネージド テーブルの機能が正常に動作しなくなるため、Unity カタログのマネージド テーブルへのパスベースのアクセスはサポートされていません ( 互換モードを除く)。

マネージド テーブルを作成する

マネージド テーブルを作成するには、次のものが必要です。

  • テーブルの親スキーマに対する USE SCHEMA
  • テーブルの親カタログに対する USE CATALOG
  • テーブルの親スキーマに対する CREATE TABLE

空のマネージド テーブルを作成するには、次の構文を使用します。 プレースホルダー値を次のように置き換えます。

  • <catalog-name>: テーブルを含むカタログの名前。
  • <schema-name>: テーブルを含むスキーマの名前。
  • <table-name>: テーブルの名前。
  • <column-specification>: 各列の名前とデータ型。

SQL

-- Create a managed Delta table
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
);

-- Create a managed Iceberg table
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
)
USING iceberg;

Python

saveAsTable()を使用してマネージド Delta Lake テーブルを作成します。

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", StringType())])

spark.createDataFrame([], schema).write \
  .saveAsTable("<catalog-name>.<schema-name>.<table-name>")

または、生成された列やテーブルのプロパティなど、デルタ固有のオプションに対して DeltaTableBuilder API を使用します。

from delta.tables import DeltaTable

DeltaTable.create(spark) \
  .tableName("<catalog-name>.<schema-name>.<table-name>") \
  .addColumn("<column-name>", "<data-type>") \
  .property("<key>", "<value>") \
  .execute()

マネージド Apache Iceberg テーブルを作成します。

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", StringType())])

spark.createDataFrame([], schema).write \
  .format("iceberg") \
  .saveAsTable("<catalog-name>.<schema-name>.<table-name>")

読み取りと書き込みのパフォーマンスを維持するために、Azure Databricksは定期的に操作を実行して、マネージド Apache Iceberg テーブルのメタデータを最適化します。 このタスクは、Apache Iceberg テーブルに対する MODIFY アクセス許可を持つサーバーレス コンピューティングを使用して実行されます。 この操作はテーブルのメタデータにのみ書き込み、コンピューティングはジョブの期間中、テーブルに対するアクセス許可のみを保持します。

Note

Apache Iceberg テーブルを作成するには、 USING icebergを明示的に指定します。 それ以外の場合、Azure Databricks は既定で Delta Lake テーブルを作成します。

クエリ結果または DataFrame 書き込み操作からマネージド テーブルを作成できます。 次の記事では、Azure Databricks でマネージド テーブルを作成するために使用可能な多数のパターンの一部を示します。

既存のマネージド テーブルのコピーを作成するには、clone を使用します。 マネージド Delta Lake テーブルでは、ディープクローンとシャロークローンをサポートしています。 マネージド Apache Iceberg テーブルでは、ディープ 複製のみがサポートされます。 「Azure Databricksのテーブルを複製する」「マネージド Iceberg テーブルを複製する」を参照してください。

マネージド テーブルをドロップする

マネージド テーブルを削除するには、次が必要です。

  • テーブルに対する MANAGE または、テーブルの所有者である必要があります。
  • テーブルの親スキーマに対する USE SCHEMA
  • テーブルの親カタログに対する USE CATALOG

マネージド テーブルを削除するには、次のコマンドを実行します。

SQL

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

Python

spark.sql("DROP TABLE IF EXISTS catalog_name.schema_name.table_name")

または、Databricks Runtime 18.2 以降では、 spark.catalog.dropTable()を使用します。

spark.catalog.dropTable("catalog_name.schema_name.table_name", ifExists=True)

Unity Catalog では、誤って削除されたマネージド テーブルを回復するための UNDROP TABLE コマンドがサポートされています。 既定では、テーブルは削除されてから 7 日間回復可能です。 復旧期間が終了すると、Azure Databricksは、基になるデータ ファイルをクラウド テナントから 48 時間以内に削除します。

復旧期間を構成する

Important

構成可能な復旧期間は パブリック プレビュー段階です

削除されたマネージド テーブルの復旧可能な期間は、カタログ レベルまたはスキーマ レベルで構成できます。 復旧期間が両方のレベルで設定されている場合は、そのスキーマ内のテーブルに対してスキーマ レベルの設定が優先されます。

復旧期間を構成するには、カタログまたはスキーマに対する MANAGE 特権または所有権が必要です。 この設定は、構成後に削除されたテーブルにのみ適用されます。 既に削除されたテーブルには影響しません。

回復期間は0時間で回復が無効になる場合もあれば、7日から30日までかかることもあります。 長い期間は重要なデータの誤ったドロップを防ぎ、短い期間は削除されたデータをより速く削除し、頻繁にテーブルを作成・削除するETLパイプラインでのストレージコストを節約します。 0に設定すると、 UNDROPで取り消されたテーブルは復元できません。 Azure Databricksはドロップから48時間以内にクラウドストレージからデータファイルを削除します。

復旧期間を設定するには、ALTER CATALOG句でALTER SCHEMAまたはRETAIN DROPPED TOを使用します。

SQL

-- Set a 30-day recovery period on a catalog
ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS;

-- Set a 7-day recovery period on a schema (overrides the catalog setting)
ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS;

Python

spark.sql("ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS")
spark.sql("ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS")

RETAIN DROPPED FOR句を使用してカタログまたはスキーマを作成するときに、復旧期間を設定することもできます。

SQL

CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS;
CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS;

Python

spark.sql("CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS")
spark.sql("CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS")

現在の復旧期間を確認するには、 DESCRIBE EXTENDEDを実行します。 出力には、次の Recovery Period Hours 行が含まれます。

SQL

DESCRIBE CATALOG EXTENDED my_catalog;
DESCRIBE SCHEMA EXTENDED my_catalog.my_schema;

Python

spark.sql("DESCRIBE CATALOG EXTENDED my_catalog").show()
spark.sql("DESCRIBE SCHEMA EXTENDED my_catalog.my_schema").show()