Databricks にて Unity Catalog のマネージドテーブルを Shallow Clone した際に、ソースのテーブルを削除することによりターゲットテーブルが破損する事象への対応方法

<!-- ITプロフェッショナル向けの記事として、まとめを記述して

````markdown
# Databricks にて Unity Catalog のマネージドテーブルを Shallow Clone した際に、ソースのテーブルを削除することによりターゲットテーブルが破損する事象への対応方法 -->

## 概要

Databricks にて Unity Catalog のマネージドテーブルを Shallow Clone した際に、ソースのテーブルを削除することによりターゲットテーブルが破損する事象が発生します。検証したところ、次のようなエラーが発生しました。その対処方法を共有します。

```text
RuntimeException: Couldn't initialize file system for path abfss://{container_name}@{storage_name}.dfs.core.windows.net/b590278a-5927-4895-af29-08e84348a015/tables/886d6b39-c365-4bed-b4e2-e5720f74f15a/part-00000-cccfcc82-3da2-4c68-bc31-345d4fe8a8af-c000.snappy.parquet
Caused by: KeyProviderException: Failure to initialize configuration for storage account {storage_name}.dfs.core.windows.net: Invalid configuration value detected for fs.azure.account.key
Caused by: InvalidConfigurationValueException: Invalid configuration value detected for fs.azure.account.key
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4c47a529-9e1b-2af6-3fdd-27c38fbb04f7.png)


Databricks のドキュメントにて、次のような制限事項が記載されています。検証したところ、ソーステーブルの削除だけでなく、再作成したテーブルを Shallow Clone すると上記のようなエラーが発生しました。エラーの再現方法とその対処方法について記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a351a3b0-216f-a9b6-7f47-7466c414c289.png)

> マネージド テーブルの場合、ソース テーブルを削除すると、シャロー クローンのターゲット テーブルが破損します。

引用元：[Unity Catalog テーブルのシャロー クローン - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/delta/clone-unity-catalog#limitations)

## エラーの再現方法と対処方法

### 事前準備

検証に利用するカタログやテーブルを作成します。

```python
%sql
-- カタログとスキーマを作成
CREATE CATALOG IF NOT EXISTS shallow_clone_error;
CREATE SCHEMA IF NOT EXISTS shallow_clone_error.schema;

-- テーブルを作成
CREATE TABLE shallow_clone_error.schema.table_01
SELECT * FROM samples.tpch.nation;

-- Shallow Clone の実施
CREATE OR REPLACE TABLE shallow_clone_error.schema.shallow_cloned_table
SHALLOW CLONE shallow_clone_error.schema.table_01;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c2820aff-c356-86ef-d6c3-bfba31326db7.png)

データを確認します。

```python
%sql
-- データを確認
SELECT
  *
  FROM
    shallow_clone_error.schema.shallow_cloned_table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/264a057f-6ebc-cdf2-5553-f696abf1793f.png)

### エラーの再現方法

Shallow Clone のソーステーブルを削除だけでは、Shallow Clone のターゲットテーブルへのクエリはエラーとなりませんでした。

```python
%sql
-- ソース テーブルを削除
DROP TABLE shallow_clone_error.schema.table_01;

-- エラーにならない想定
SELECT
  *
  FROM
    shallow_clone_error.schema.shallow_cloned_table
```

```python
%sql
-- 同名のテーブルを再作成してエラーとなることを確認
CREATE TABLE shallow_clone_error.schema.table_01
SELECT * FROM samples.tpch.nation;

CREATE OR REPLACE TABLE shallow_clone_error.schema.shallow_cloned_table
SHALLOW CLONE shallow_clone_error.schema.table_01;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/583d5beb-b2c9-6ad3-7f77-666560901202.png)

ソーステーブルの再作成と Shallow Clone を再実施後に、ターゲットテーブルにクエリを発行したところエラーとなりました。

```python
%sql
-- エラーになる想定
SELECT
  *
  FROM
    shallow_clone_error.schema.shallow_cloned_table
```

```text
RuntimeException: Couldn't initialize file system for path abfss://{container_name}@{storage_name}.dfs.core.windows.net/b590278a-5927-4895-af29-08e84348a015/tables/886d6b39-c365-4bed-b4e2-e5720f74f15a/part-00000-cccfcc82-3da2-4c68-bc31-345d4fe8a8af-c000.snappy.parquet
Caused by: KeyProviderException: Failure to initialize configuration for storage account {storage_name}.dfs.core.windows.net: Invalid configuration value detected for fs.azure.account.key
Caused by: InvalidConfigurationValueException: Invalid configuration value detected for fs.azure.account.key
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d2b89142-b0d9-81b1-6919-bd866bc13c39.png)


想定外ではありますが、カウントを表示することは可能でした。カウントが可能であることで、本エラーの解明に時間がかかってしまいました。

```python
%sql
-- 想定外であるがカウントできることを確認
SELECT
  count(*)
  FROM
    shallow_clone_error.schema.shallow_cloned_table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4d8c84e1-abcf-fda7-4997-898bd234c6d3.png)

### エラーの対処方法

Shallow Clone のターゲットテーブルを DROP してから Shallow Clone を実行することで、クエリが正常終了しました。

```python
%sql
-- Shallow Clone したテーブルを削除してから再実行
DROP TABLE IF EXISTS shallow_clone_error.schema.shallow_cloned_table;
CREATE OR REPLACE TABLE shallow_clone_error.schema.shallow_cloned_table
SHALLOW CLONE shallow_clone_error.schema.table_01
```

```python
%sql
-- エラーにならない想定
SELECT
  *
  FROM
    shallow_clone_error.schema.shallow_cloned_table
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6c75b9dd-6577-84ef-3ba7-364c60578588.png)

## 事後処理

検証で利用したカタログを削除します。

```python
%sql
-- カタログを削除
DROP CATALOG IF EXISTS shallow_clone_error CASCADE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a2e6dd2-c952-e31b-2dd3-9af7a2219ae3.png)

## まとめ
この記事では、DatabricksのUnity CatalogでマネージドテーブルをShallow Cloneした際に、ソーステーブルを削除するとターゲットテーブルが破損する事象について説明しました。具体的には、ソーステーブルの削除だけでなく、再作成したテーブルをShallow Cloneするとエラーが発生することを確認しました。

その対処方法として、Shallow CloneのターゲットテーブルをDROPしてからShallow Cloneを実行することで、クエリが正常に終了することを確認しました。

この情報が、DatabricksとUnity Catalogを使用する際の参考になれば幸いです。
<!-- ```` -->