外部テーブルに関する作業
Unity Catalogでは、外部テーブルはクラウドテナント内のクラウドオブジェクトストレージにデータファイルを保存します。Unity Catalogは、引き続きテーブルのメタデータを管理し、すべてのクエリにわたる完全なデータガバナンスを保証します。しかし、データのライフサイクル、最適化、ストレージの場所、またはレイアウトは管理しません。
Unity Catalog外部テーブルを定義するときは、保存場所を指定する必要があります。 この場所はUnity Catalogに登録されている外部ロケーションです。 外部テーブルを削除すると、Unity Catalog はテーブル メタデータを削除しますが、基になるデータ ファイルは削除しません。
このページでは、Unity Catalog 外部テーブルに焦点を当てています。レガシーHive metastoreの外部テーブルは、動作が異なります。従来のHive metastore内のデータベース オブジェクトを参照してください。
外部テーブルを使用する場合
Databricks では、次のユース ケースで外部テーブルを使用することをお勧めします。
- JSONやAvroなど、Unity Catalogのマネージドテーブルと互換性のない既存のデータによってサポートされるテーブルを登録する必要があります。外部テーブルのファイル形式を参照してください。
- 他の外部アクセスパターンをサポートしない非Databricksクライアントからデータに直接アクセスする必要があります。ユーザーが外部システムからデータファイルにアクセスする場合、Unity Catalogの権限は適用されません。外部システムを使用したDatabricksデータへのアクセスを参照してください。
ほとんどの場合、Databricks は、自動テーブル最適化、クエリパフォーマンスの高速化、およびコスト削減のメリットを活かすために、Unity Catalog マネージドテーブルの使用を推奨しています。外部テーブルをマネージドテーブルに移行するには、「外部 Delta Lake テーブルをマネージド Unity Catalog テーブルに変換する」を参照してください。
Databricks 以外のクライアントを使用して、または Databricks 内からのパスベースのアクセスを使用して外部テーブルのメタデータを更新した場合、そのメタデータは Unity Catalog と状態を自動的に同期しません。 Databricks では、このようなメタデータの更新はお勧めしませんが、更新する場合は、Unity Catalog のスキーマを最新の状態にするために MSCK REPAIR TABLE <table-name> SYNC METADATA を実行する必要があります。 REPAIR TABLEを参照してください。
外部テーブルのファイル形式
外部テーブルでは、次のファイル形式を使用できます。
- DELTA
- CSV
- JSON
- AVRO
- PARQUET
- ORC
- TEXT
外部テーブルを作成する
SQL コマンドまたは DataFrame 書き込み操作を使用して外部テーブルを作成できます。
始める前に
外部テーブルを作成する前に、まずクラウド ストレージへのアクセスを許可する外部ロケーションを構成する必要があります。
Databricks 、 AWS CloudFormation クイックスタート テンプレートを使用して外部ロケーションを作成することをお勧めします。 このアプローチでは、ストレージ資格情報と外部ロケーションの両方が自動的に構成され、セットアップ プロセスが大幅に簡素化されます。 詳細な手順については、 AWS CloudFormation を使用したS3のストレージ認証情報と外部ロケーションの作成」を参照してください。
外部テーブルを作成するには、次の権限要件を満たす必要があります。
- 外部テーブルがアクセスする
LOCATIONへのアクセスを許可する外部ロケーションに対するCREATE EXTERNAL TABLE特権。 - テーブルの親カタログに対する
USE CATALOGパーミッション。 - テーブルの親スキーマに対する
USE SCHEMAアクセス許可。 - テーブルの親スキーマに対する
CREATE TABLEアクセス許可。
S3 外部ロケーションが複数のメタストアに関連付けられている場合は、異なるメタストアから同じ外部テーブルへの書き込みによって一貫性の問題が発生する可能性があるため、その S3 ロケーションを使用するテーブルへの書き込みアクセスを許可しないでください。ただし、複数のメタストアにわたって同じ S3 外部ロケーションから読み取ることは安全です。
例
ノートブックまたはSQLクエリエディターで次のいずれかの例を使用し、外部テーブルを作成します。
次の例で、プレースホルダーの値を置き換えます。
<catalog>:テーブルを格納するカタログの名前。<schema>:テーブルを格納するスキーマの名前。<table-name>:テーブルの名前。<column-name>と<data-type>:各列の名前とデータ型。<bucket-path>: テーブルが作成されるクラウドストレージバケットへのパス。<table-directory>:テーブルが作成されるディレクトリ。テーブルごとに一意のディレクトリを使用します。<source-table>:クエリ結果からテーブルを作成する際にデータソースとして使用するテーブル。
- SQL
- Python
テーブルパスには、標準の ASCII 文字 ( A–Z、 a–z、数字 0–9、および /、 _、 -などの一般的な記号) のみを含める必要があります。
定義済みスキーマでS3に外部テーブルを作成するには、次を実行します。
CREATE TABLE <catalog>.<schema>.<table-name>
(
<column-name> <data-type>
)
LOCATION 's3://<bucket-path>/<table-directory>';
クエリ結果からS3に外部テーブルを作成するには、次を実行します:
CREATE TABLE <catalog>.<schema>.<table-name>
LOCATION 's3://<bucket-path>/<table-directory>'
AS SELECT * FROM <source-table>;
定義済みスキーマでS3に外部テーブルを作成するには、次を実行します。
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType([StructField("<column-name>", <data-type>())])
spark.createDataFrame([], schema).write \
.option("path", "s3://<bucket-path>/<table-directory>") \
.saveAsTable("<catalog>.<schema>.<table-name>")
DataFrameからS3に外部テーブルを作成するには、次を実行します。
df.write \
.option("path", "s3://<bucket-path>/<table-directory>") \
.saveAsTable("<catalog>.<schema>.<table-name>")
テーブル作成パラメーターの詳細については、 CREATE TABLEを参照してください。
次の SQL 構文オプションは、DataFrame 操作で機能します。
外部テーブルを削除する
テーブルを削除するには、その所有者であるか、テーブルに対する MANAGE 権限を持っている必要があります。外部テーブルを削除するには、次のコマンドを実行します。
- SQL
- Python
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
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 は、外部テーブルをドロップしても、クラウド ストレージ内の基になるデータを削除しません。 テーブルに関連付けられたデータを削除する必要がある場合は、基になるデータ ファイルを直接削除する必要があります。
ノートブックの例: 外部テーブルを作成する
次のノートブックの例を使用して、カタログ、スキーマ、および外部テーブルを作成し、それらに対するアクセス許可を管理できます。
セットアップを簡素化するために、Databricksはこのノートブックを実行する前に AWS CloudFormation Quickstart を使って外部ロケーションを作成することを推奨しています。