【Databricks】UNDROPコマンドの挙動

# はじめに

株式会社NTTデータ [NTTデータ デザイン＆テクノロジーコンサルティング事業本部 デジタルテクノロジー＆データマネジメントユニット](https://enterprise-aiiot.nttdata.com/) の Yusuke Imamura です。
Databricksのエバンジェリスト資格 [Databricks Champion](https://www.databricks.com/jp/blog/2022/12/06/jimarelegendary-heroes-data-ai.html) の認定を受けています。

Databricksを扱っていく中で、誤ってテーブルを削除してしまったことはありませんか？
そういった際に、これまではテーブルをDROPしたらマネージドテーブルなら復元できず、アンマネージドテーブルなら新しく作る必要がありました。

しかし、Databricks Runtime 12.1で新しくUNDROPというコマンドが使えるようになり、これにより現在はマネージド・アンマネージド問わずテーブルを復元することが可能です。
[UNDROP TABLE | Databricks on AWS ](https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-ddl-undrop-table.html#undrop-table)
ただ、UNDROPに関するドキュメントを見ただけでは細かい仕様等中々つかみにくい部分があったので、簡単に一通り動作検証をしてみました。
(※2023/8/31時点でのドキュメントに基づいて検証)

この記事ではドキュメントベースで実際の挙動を確認したものを共有いたします。

# UNDROPコマンドについて
UNDROPはUnity Catalog上のDROPされたテーブルを復元することができるコマンドです。
この際テーブル名のみを引数にした時、1番直近にDROPしたものが復元されます。
またDROPした同名のテーブルが複数ある場合は、下記のSHOW TABLES DROPPEDコマンドによってわかるtable_idから、「任意の」テーブルを復元することが可能となります。
```sql:SQL
UNDROP TABLE { table_name | WITH ID table_id }
```
## SHOW TABLES DROPPEDコマンドについて
Unity Catalog 内の、保持期間内(7日間)にDROPされ、かつまだUNDROPできるすべてのテーブルを一覧表示することができるコマンドです。
※この保持期間(7日間)は2023/8/24時点では変更不可
```sql:SQL
SHOW TABLES DROPPED [ { FROM | IN } schema_name ]
```
# 今回の検証内容
実際にUNDROPを使って以下の検証を行いました。
また、その際に挙動が異なる可能性を考慮してマネージドテーブルとアンマネージドテーブルの両方を用いました。
1. ドキュメント通りにDROP、UNDROPが動作するかを確認
1. 複数の同名テーブルをDROPしている状態でUNDROPコマンドを実行した場合、最後にDROPされたテーブルがUNDROPされるかを確認
1. SHOW TABLES DROPPEDの挙動及び、そこで得られるテーブルIDを用いて任意のテーブルをUNDROPできるかを確認
1. DROPしたテーブルの保持期間(7日間)経過後のUNDROP・SHOW TABLES DROPPEDの挙動を確認
1. DROP後に実データを削除した際のUNDROPの挙動を確認

# 検証結果
先に検証結果をお伝えすると、以下のような形になりました。
| No | 検証 | 結果 |
| -- | ---  | ---  | 
|1| ドキュメント通りにDROP、UNDROPの動作を確認 |  ドキュメント通りの挙動を確認できた  |
|2| 複数の同名テーブルをDROPしている状態でUNDROPコマンドを実行した場合、最後にDROPされたテーブルがUNDROPされるかを確認 | ドキュメント通りの挙動を確認できた  |
|3| SHOW TABLES DROPPEDの挙動及び、そこで得られるテーブルIDを用いて任意のテーブルをUNDROPできることを確認 |  テーブルIDにより任意のテーブルをUNDROPできた | 
|4| DROPしたテーブルの保持期間(7日間)経過後のUNDROP・SHOW TABLES DROPPEDの挙動を確認 |  DROP後7日経過した時点でUNDROP不可能になり、SHOW TABLES DROPPEDにも現れなくなった | 
|5| DROP後に実データを削除した際のUNDROPの挙動を確認 |DROP後に実データを削除するとUNDROP時にエラーとなる |

# 検証内容の詳細
## ドキュメント通りにDROP、UNDROPが動作するかを確認
### やったこと
① テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'table_name';
SELECT * FROM 'table_name';
```
→参照できなくなった

② UNDROPして復元できてることを確認
```sql:SQL
UNDROP TABLE 'table_name';
SELECT * FROM 'table_name';
```
→参照できた（＝テーブルが復元された）
## 数の同名テーブルをDROPしている状態でUNDROPコマンドを実行した場合、最後にDROPされたテーブルがUNDROPされることを確認

### やったこと
① テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'schema_name'.undrop_test_table;
SELECT * FROM 'schema_name'.undrop_test_table;
```
→参照できなくなった

② ①のテーブルと同名のテーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'schema_name'.undrop_test_table;
SELECT * FROM 'schema_name'.undrop_test_table;
```
→参照できなくなった

③ テーブル名のみを引数にしてUNDROPを実行
※2つの同名のテーブルがDROPされた状態でテーブル名のみを指定してUNDROPした場合、後からDROPした方がUNDROPされる
```sql:SQL
UNDROP TABLE 'schema_name'.undrop_test_table;
SELECT * FROM 'schema_name'.undrop_test_table;
```
→後からDROPした②のテーブルがUNDROPされた

## SHOW TABLES DROPPEDの挙動及び、そこで得られるテーブルIDを用いて任意のテーブルをUNDROPできることを確認
### やったこと
① テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'schema_name'.undrop_test_table;
SELECT * FROM 'schema_name'.undrop_test_table;
```
→参照できなくなった

② ①のテーブルと同名のテーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'schema_name'.undrop_test_table;
SELECT * FROM 'schema_name'.undrop_test_table;
```
→参照できなくなった

③SHOW TABLES DROPPEDで①のテーブルのTABLE IDを確認し、[ UNDROP WITH ID table_id ]を実行することで、指定したテーブルをUNDROPできるか確認
```sql:SQL
SHOW TABLES DROPPED IN 'schema_name'.undrop_test_table;
UNDROP TABLE WITH ID 'table_id';
SELECT * FROM 'schema_name'.undrop_test_table;
```
→①のテーブルをUNDROPし、参照できた

## DROPしたテーブルの保持期間(7日間)経過後のUNDROP・SHOW TABLES DROPPEDの挙動を確認

### やったこと
① テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'table_name';
SELECT * FROM 'table_name';
```
→参照できなくなった

--7日後--

②7日経過後にUNDROPの結果を確認
```sql:SQL
UNDROP TABLE WITH ID 'table_id';
```
```:エラーメッセージ
[RequestId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
EllorCrass=INVALID_STATE_RESTORATION_PERIOD_EXPIRED]
Cannot undrop table because the table was deleted before the maximum supported restorable period of 7 days.
```
→保持期間が過ぎている旨のエラーメッセージが表示され、UNDROPできなかった

③SHOW TABLES DROPPEDの挙動も確認
```sql:SQL
SHOW TABLES DROPPED IN 'schema_name'
```
→対象のテーブルは表示されなかった

## DROP後に実データを削除した際のUNDROPの挙動を確認

※今回はテーブルをDROPしたあとに「ディレクトリごと実データを削除」するパターンと「ディレクトリは保持したまま中身だけ削除する」パターンを確認
### 手順
パターン1：ディレクトリごと実データを削除
① テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'table_name'
SELECT * FROM 'table_name'
```
→参照できなくなった

②AWS S3上でディレクトリごと実データを削除

③ UNDROPを実行
```sql:SQL
UNDROP TABLE 'table_name';
SELECT * FROM 'table_name';
```
```:エラーメッセージ
Delta table 'table_name' doesn't exist.
```
→テーブル非存在エラーメッセージが表示され、UNDROPできなかった

パターン2：ディレクトリは保持したまま中身だけ削除
④ テーブルを作成しDROPして参照できなくなっていることを確認
```sql:SQL
DROP TABLE 'table_name'
SELECT * FROM 'table_name'
```
→参照できなくなった

⑤ AWS S3上でディレクトリを保持したまま中身のみを削除

⑥ UNDROPを実行
```sql:SQL
UNDROP TABLE 'table_name';
SELECT * FROM 'table_name';
```
```:エラーメッセージ
Delta table 'table_name' doesn't exist.
```
→テーブル非存在エラーメッセージが表示され、UNDROPできなかった
 

# おわりに
今回はDatabricksに追加されたUNDROPという新機能を検証しました。
マネージドテーブルも含めて削除したテーブルを戻せるというのは便利な反面、挙動をよく押さえておきたいですね。
こちらの記事が参考になれば幸いです。


# 関連リンク
* [Data and AI Summit 2023 - Databricks 現地レポート（6/27 Partner Summit)](https://qiita.com/nttd-yuan/items/76950df80898b48ad2d3)
* [Data and AI Summit 2023 - Databricks 現地レポート（6/28 基調講演 #1）](https://qiita.com/nttd-inoutk/items/c7087ba42622fb332061)
* [Data and AI Summit 2023 - Databricks 現地レポート（6/28 基調講演 #2）](https://qiita.com/nttd-inoutk/items/c312d7af33448bbd51f2)
* [Data and AI Summit 2023 - Databricks 現地レポート（6/29 基調講演 #1）](https://qiita.com/nttd-yuan/items/22d4aec254f0439d6aa4)
* [Data and AI Summit 2023 - Databricks 現地レポート（6/29 基調講演 #2）](https://qiita.com/nttd-yuan/items/06efb8020e67bd91649d)
* Data and AI Summit 2023 - Databricks 現地レポート（EXPO）※本記事

# 仲間募集
NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary> 1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア) </summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary> 2. データサイエンス領域（データサイエンティスト／データアナリスト） </summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。

https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary> 3.お客様のAI活用の成功を推進するAIサクセスマネージャー </summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary> 4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》 </summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>

# ソリューション紹介
<details><summary> Trusted Data Foundationについて </summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</details>

<details><summary> TDF-AM（Trusted Data Foundation - Analytics Managed Service）について </summary>
～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDF-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</details>

<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変?・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活?戦略の?案から、AI技術の活?も含めたアナリティクス、分析基盤構築・運?、分析業務のアウトソースまで、ワンストップの?援を提供いたします。

 https://enterprise-aiiot.nttdata.com/service/databricks

</details>

</details>

<details><summary> NTTデータとSnowflakeについて </summary>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake

</details>

</details>

<details><summary> NTTデータとInformaticaについて </summary>
データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica

</details>

</details>

<details><summary> NTTデータとTableauについて </summary>
ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau

</details>

</details>

<details><summary> NTTデータとAlteryxについて </summary>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。
Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://enterprise-aiiot.nttdata.com/service/alteryx

</details>

</details>

<details><summary> NTTデータとDataRobotについて </summary>
DataRobotは、包括的なAIライフサイクルプラットフォームです。
NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot

</details>