Databricks にて Hadoop Catalog 管理下にある Apache Iceberg テーブルを DROP する方法

## 概要

Databricks にて Hadoop Catalog 管理下にある Apache Iceberg テーブルに対して DROP TABLE 文を実行したところ下記のエラーが発生したため、対応方法を共有します。

> AnalysisException: [TABLE_OR_VIEW_NOT_FOUND] The table or view `spark_catalog`.`default`.`ICEBERG_TBL_5` cannot be found. Verify the spelling and correctness of the schema and catalog.
If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog.
To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1d49d024-59bf-46e4-b6f4-7a66c3bb6669.png)

DROP 文が想定通りに動作していないようなので、テーブルのディレクトリを直接削除後に、テーブルの更新を実施することで対応しました。

```python
# ディレクトリ、 Namespace、テーブル名を変数にセット
wh_dir = spark.conf.get("spark.sql.catalog.spark_catalog.warehouse")
namespace_name = "default"
table_name = "ICEBERG_TBL_5"

# テーブルのディレクトリごと削除
table_dir = f"{wh_dir}/{namespace_name}/{table_name}"
dbutils.fs.rm(table_dir, True)

# Hadoop Catalog を更新
spark.sql(f"REFRESH TABLE {namespace_name}.{table_name}")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d2900166-306c-401e-8949-d853e1a4eb00.png)

## エラーの再現方法

### テーブル作成後にテーブルの存在確認を実施

```sql
%sql
CREATE TABLE ICEBERG_TBL_5(ID INT,NAME STRING) USING ICEBERG;
SHOW TABLES IN default;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/65192d67-d5f4-40ca-ab28-a56c4ec0be79.png)

### DROP TABLE 文がエラーとなることを確認

```sql
%sql
DROP TABLE default.ICEBERG_TBL_5;
```

> AnalysisException: [TABLE_OR_VIEW_NOT_FOUND] The table or view `spark_catalog`.`default`.`ICEBERG_TBL_5` cannot be found. Verify the spelling and correctness of the schema and catalog.
If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog.
To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f1b0b6b6-888c-4fbe-b547-3bab5da28ea2.png)


### DROP TABLE PURGE 文がエラーとなることを確認

```sql
%sql
DROP TABLE default.ICEBERG_TBL_5 PURGE;
```

> AnalysisException: [TABLE_OR_VIEW_NOT_FOUND] The table or view `spark_catalog`.`default`.`ICEBERG_TBL_5` cannot be found. Verify the spelling and correctness of the schema and catalog.
If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog.
To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7dd4aae7-7bb0-48b0-bc1a-bafb109210fa.png)

## エラーへの対応方法

### テーブルのディレクトリを削除してカタログを更新

```python
# ディレクトリ、 Namespace、テーブル名を変数にセット
wh_dir = spark.conf.get("spark.sql.catalog.spark_catalog.warehouse")
namespace_name = "default"
table_name = "ICEBERG_TBL_5"

# テーブルのディレクトリごと削除
table_dir = f"{wh_dir}/{namespace_name}/{table_name}"
dbutils.fs.rm(table_dir, True)

# Hadoop Catalog を更新
spark.sql(f"REFRESH TABLE {namespace_name}.{table_name}")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d2900166-306c-401e-8949-d853e1a4eb00.png)

### テーブルがなくなったことを確認

```sql
%sql
SHOW TABLES IN default;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/887355f8-92ae-41a6-aaea-5e62b7869da8.png)