テーブルを削除または置換する
Databricksは、Unity CatalogまたはHive metastoreに登録されているテーブルを削除または置換するためのSQL標準DDLコマンドをサポートしています。ドロップおよび置換動作は、テーブルのタイプとメタストアによって異なります。データ損失や並列操作の失敗を避けるために、適切なコマンドを選択してください。
テーブルを削除するタイミング
Databricks は、テーブルを完全に削除し、同じ場所に新しいテーブルを作成する意図がない場合は、メタストアからテーブルを削除するために DROP TABLE を使用することを推奨します。例えば:
DROP TABLE table_name
DROP TABLE テーブルの種類と、テーブルが Unity Catalog または従来の Hive metastore に登録されているかどうかに応じて、動作が異なります。
テーブルタイプ | メタストア | 挙動 |
|---|---|---|
マネージド | Unity Catalog | テーブルはメタストアから削除され、基になるデータは削除対象としてマークされます。マネージドテーブルを構成されたリカバリ期間内(デフォルトは7日間)に |
マネージド | Hive | テーブルはメタストアから削除され、その基になるデータは削除されます。 |
外部 | Unity Catalog | テーブルはメタストアから削除されますが、基になるデータは残ります。URI アクセス特権は、データを含む外部ロケーションによって管理されるようになりました。 |
外部 | Hive | テーブルはメタストアから削除されますが、基になるデータは残ります。URIアクセス権限に変更はありません。 |
Unity Catalogは、内部テーブルIDを使用してテーブルの履歴を維持します。すべてのテーブルタイプについて、ドロップ操作が完了すると、以前に登録されたテーブル名はメタストアからのデータおよびテーブル履歴へのアクティブなリンクを失います。
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を使用する必要があります。
次のアンチパターンは使用しないでください:
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`
アトミックな置換はテーブルの履歴を保持するため、並列トランザクションは参照するソーステーブルのバージョンを検証し、予期せぬ動作を伴わずに失敗するか、並列トランザクションを調整できます。