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

テーブルを削除または置換する

Databricks Unity CatalogまたはHive metastoreに登録されたテーブルを削除および置換するためのSQL標準 DDL コマンドをサポートしています。 この記事では、構成された環境と望ましい結果に応じて、テーブルの削除と置換の例と構文の推奨事項を示します。

テーブルを削除するタイミング

DROP TABLE を使用してメタストアからテーブルを削除するのは、テーブルを完全に削除し、同じ場所に新しいテーブルを作成する予定がない場合です。例えば:

SQL
DROP TABLE table_name

DROP TABLE セマンティクスは、テーブルのタイプと、テーブルが Unity Catalog に登録されているか、レガシ テーブルに登録されているかによって異なります Hive metastore。

テーブルの種類

METASTORE

挙動

マネージド

Unity Catalog

テーブルがメタストアから削除され、基になるデータに削除のマークが付けられます。 Unity CatalogマネージドテーブルにデータをUNDROPできます。

マネージド

Hive

テーブルがメタストアから削除され、基になるデータが削除されます。

外部

Unity Catalog

テーブルはメタストアから削除されますが、基になるデータは残ります。 URI アクセス権限は、データを含む外部ロケーションによって管理されるようになりました。

外部

Hive

テーブルはメタストアから削除されますが、基になるデータは残ります。 URI アクセス権限は変更されません。

DROP TABLE セマンティクスはテーブルの種類によって異なり、Unity Catalog は内部テーブル ID を使用してテーブルの履歴を維持します。ただし、すべてのテーブルに共通する結果は、操作が完了すると、以前に登録されたテーブル名にはメタストアのデータとテーブル履歴へのアクティブなリンクがなくなるということです。

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

注記

Databricks では、本番運用 パイプラインまたはシステムで同じ名前を使用してテーブルを削除してから再作成するパターンは、並列操作で予期しない結果をもたらす可能性があるため、お勧めしません。 並列操作によるデータの置換を参照してください。

テーブルを置き換えるタイミング

Databricks では、ターゲット テーブルを新しいデータで完全に上書きするユース ケースではCREATE OR REPLACE TABLEステートメントを使用することをお勧めします。たとえば、Parquet ディレクトリのすべてのデータでテーブルを上書きするには、次のコマンドを実行します。

SQL
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
重要

CREATE OR REPLACE TABLE Unity Catalog で管理される Iceberg テーブルではサポートされません。代わりに、個別のDROP TABLEコマンドとCREATE TABLEコマンドを使用してください。

CREATE OR REPLACE TABLE 使用しているテーブルタイプやメタストアに関係なく、同じセマンティクスを持っています。 CREATE OR REPLACE TABLE の重要な利点は次のとおりです。

  • テーブルの内容は置き換えられますが、テーブルの ID は維持されます。
  • テーブル履歴は保持され、 RESTORE コマンドを使用してテーブルを以前のバージョンに戻すことができます。
  • 操作は 1 つのトランザクションであるため、テーブルが存在しない時間はありません。
  • テーブルからの読み取り並列クエリは、中断することなく続行できます。 置換前と置換後のバージョンがテーブル履歴にまだ存在するため、並列クエリは必要に応じてどちらのバージョンのテーブルも参照できます。
  • 元のテーブルに列マスクが含まれていた場合、それらのマスクは、新しいテーブルにまだ存在するすべての列に対して保持されます。これにより、データ アクセス ポリシーが確実に保持されます。

CREATE TABLE [USING]を参照してください。

データを並列操作に置き換える

並列操作で使用される可能性のあるテーブル内のデータを完全に置き換える場合は、 CREATE OR REPLACE TABLE.

次のアンチパターンは使用しないでください。

SQL
-- 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を使用することをお勧めします。

SQL
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`

アトミック・データの置換中もテーブル・ヒストリーは保持されるため、並列トランザクションは参照されるソース・テーブルのバージョンを検証でき、予期しない動作や結果を引き起こすことなく、必要に応じて並列トランザクションを失敗または調整できます。