Azure Databricks は、Unity Catalog または Hive メタストアに登録されているテーブルをドロップし、置き換えるための SQL 標準 DDL コマンドをサポートしています。 ドロップと置換の動作は、テーブルの種類とメタストアによって異なります。 データの損失や同時操作の失敗を回避するには、適切なコマンドを選択します。
適切なタイミングでテーブルをドロップする方法
Databricks では、テーブルを完全に削除し、同じ場所に新しいテーブルを作成する意図がない場合は、 DROP TABLE を使用してメタストアからテーブルを削除することをお勧めします。 例えば次が挙げられます。
DROP TABLE table_name
DROP TABLE には、テーブルの種類と、テーブルが Unity カタログに登録されているか、レガシ Hive メタストアに登録されているかによって動作が異なります。
| テーブルのタイプ | メタストア | Behavior |
|---|---|---|
| Managed | Unity カタログ | テーブルがメタストアから削除され、基になるデータが削除対象としてマークされます。 構成された復旧期間内 (既定では 7 日間) にマネージド テーブルを UNDROP できます。
「マネージド テーブルを削除する」を参照してください。 |
| Managed | Hive | テーブルがメタストアから削除され、基となるデータが削除されます。 |
| External | Unity カタログ | テーブルはメタストアから削除されますが、基となるデータは残ります。 URI アクセス特権は、データが含まれる外部の場所によって管理されるようになりました。 |
| External | Hive | テーブルはメタストアから削除されますが、基となるデータは残ります。 URI アクセス権限は変更されません。 |
Unity カタログでは、内部テーブル ID を使用してテーブルの履歴が保持されます。 すべてのテーブルの種類について、削除操作が完了した後、以前に登録されたテーブル名には、メタストアからのデータとテーブル履歴へのアクティブなリンクがなくなりました。
DROP TABLEを参照してください。
Note
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コマンドを使ってテーブルを以前のバージョンに戻すことができます。 - 操作は 1 つのトランザクションであるため、テーブルが存在しない時間はありません。
- テーブルから読み取る同時クエリは中断することなく続行できます。 置き換え前後のバージョンはテーブル履歴にまだ存在するため、必要に応じて同時実行クエリでどちらのバージョンのテーブルを参照することもできます。
- 元のテーブルに列マスクが含まれている場合、それらのマスクは、新しいテーブルにまだ存在する列に対して保持されます。 これにより、データ アクセス ポリシーが保持されます。
CREATE TABLE [USING]を参照してください。
同時実行操作でデータを置き換える
同時実行操作で使用される可能性があるテーブル内のデータの完全な置換を実行する場合は、 CREATE OR REPLACE TABLEを使用する必要があります。
次のアンチパターンは使用しないでください。
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;
Unity カタログを使用しているかどうかに関係なく、すべてのテーブルの種類でこのパターンを使用すると、エラー、レコードの削除、または破損した結果が発生する可能性があります。
代わりに、Databricks では、次の例のように、常に CREATE OR REPLACE TABLE を使うことを推奨しています。
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
アトミック置換ではテーブル履歴が保持されるため、同時実行トランザクションは参照するソース テーブルのバージョンを検証し、予期しない動作なしで同時実行トランザクションを失敗または調整できます。