テーブルを削除または置換する
Databricksは、Unity CatalogまたはHive metastoreに登録されているテーブルを削除または置換するためのSQL標準DDLコマンドをサポートしています。この記事では、テーブルの削除と置換の例、および構成済みの環境と目的の結果に応じた構文の推奨事項について説明します。
テーブルを削除するタイミング
テーブルを完全に削除し、同じ場所に新しいテーブルを作成する意図がない場合は、メタストアからテーブルを削除するために DROP TABLE を使用する必要があります。例えば:
DROP TABLE table_name
DROP TABLE テーブルの種類、およびテーブルがUnity Catalogまたは従来のHive metastoreのどちらに登録されているかに応じて、セマンティクスが異なります。
テーブルタイプ | メタストア | 挙動 |
|---|---|---|
マネージド | Unity Catalog | テーブルはメタストアから削除され、基になるデータは削除対象としてマークされます。Unity Catalog マネージドテーブルのデータを7日間 |
マネージド | Hive | テーブルはメタストアから削除され、その基になるデータは削除されます。 |
外部 | Unity Catalog | テーブルはメタストアから削除されますが、基になるデータは残ります。URI アクセス特権は、データを含む外部ロケーションによって管理されるようになりました。 |
外部 | Hive | テーブルはメタストアから削除されますが、基になるデータは残ります。URIアクセス権限に変更はありません。 |
DROP TABLE テーブルの種類によってセマンティクスが異なり、Unity Catalog は内部テーブル ID を使用してテーブルの履歴を保持します。しかし、すべてのテーブルに共通する結果として、操作が完了すると、以前に登録されたテーブル名はmetastoreからのデータとテーブル履歴へのアクティブなリンクを失います。
See DROP TABLE.
Databricks は、本番運用のパイプラインやシステムにおいて、同じ名前を使用してテーブルを削除してから再作成するパターンを推奨していません。このパターンは、並列操作で予期せぬ結果を招く可能性があるためです。並列処理によるデータの置換を参照してください。
テーブルを置換するタイミング
Databricks は、ターゲットテーブルを新しいデータで完全に上書きしたいユースケースで、CREATE OR REPLACE TABLEステートメントの使用を推奨しています。たとえば、Parquetディレクトリのすべてのデータでテーブルを上書きするには、次のコマンドを実行できます:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
CREATE OR REPLACE TABLE 使用するテーブルの種類またはメタストアに関係なく、同じセマンティクスを持ちます。CREATE OR REPLACE TABLEの重要なメリットは以下のとおりです:
- テーブルのコンテンツは置換されますが、テーブルのIDは維持されます。
- テーブルの履歴は保持され、
RESTOREコマンドを使用してテーブルを以前のバージョンに戻すことができます。 - この操作は単一のトランザクションであるため、テーブルが存在しない状態になることはありません。
- テーブルを読み取る並列クエリーは、中断することなく継続できます。置換前後のバージョンがテーブル履歴にまだ存在するため、並列クエリは必要に応じてどちらのバージョンのテーブルも参照できます。
- 元のテーブルに列マスクが含まれていた場合、それらのマスクは新しいテーブルに引き続き存在する列に対して保持されます。これにより、データアクセス**ポリシー**が保持されることが保証されます。
CREATE TABLE [USING]を参照してください。
並列処理によるデータの置換
並列処理で使用される可能性のあるテーブルでデータの完全な置換を実行したい場合は、CREATE OR REPLACE TABLE を使用する必要があります。
次に示すアンチパターンは使用するべきではありません。
-- This is an anti-pattern. Avoid doing this!
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;
この推奨事項の理由は、マネージドテーブルまたは外部テーブルを使用しているか、およびUnity Catalogを使用しているかによって異なりますが、すべてのテーブルタイプでこのパターンを使用すると、エラー、レコードの損失、または結果の破損が発生する可能性があります。
Databricks では、代わりに、次の例に示すように、常に CREATE OR REPLACE TABLE を使用することをお勧めします。
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
アトミックなデータ置換中にテーブルの履歴が維持されるため、並列トランザクションは参照されるソーステーブルのバージョンを検証でき、そのため、予期しない動作や結果を導入することなく、必要に応じて並列トランザクションを失敗させたり、調整したりできます。