Databricks にてテーブルやビューにおける日本語の利用可否の検証

## 概要
Databricks にてテーブルやビューにて日本語を利用可否の検証結果を共有します。メタストアごとの検証結果として、次表の結果となりました。Unity Catalog を利用すれば日本語を基本的に利用できるようですが、Hive Metastore を利用する場合には テーブルのカラムのみ利用できるがビューで利用するとエラーとなるようです。検証に利用したコードとその結果を本記事では共有します。

| #    | メタストア     | オブジェクト     | 日本語の利用可否 |
| ---- | -------------- | ---------------- | ---------------- |
| 1    | Unity Catalog  | カタログ名       | 〇               |
| 2    | Unity Catalog  | スキーマ名       | 〇               |
| 3    | Unity Catalog  | テーブル名       | 〇               |
| 4    | Unity Catalog  | テーブルのカラム | 〇               |
| 5    | Unity Catalog  | ビュー名         | 〇               |
| 6    | Unity Catalog  | ビュー名のカラム | 〇               |
| 7    | Hive Metastore | スキーマ名       | ×                |
| 8    | Hive Metastore | テーブル名       | ×                |
| 9    | Hive Metastore | テーブルのカラム | 〇               |
| 10   | Hive Metastore | ビュー名         | ×                |
| 11   | Hive Metastore | ビュー名のカラム | ×                |


## 検証コードと結果

### Unity Catalog 

#### カタログの作成

```python
%sql
CREATE CATALOG IF NOT EXISTS `カタログ`;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a4744be6-81b7-d55a-2698-471c18145bcf.png)

#### スキーマの作成

```python
%sql
CREATE SCHEMA IF NOT EXISTS `カタログ`.`スキーマ`;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7196e5b3-6380-40f1-1955-47d67956e282.png)

#### テーブルの作成

```python
%sql
CREATE OR REPLACE TABLE `カタログ`.`スキーマ`.`テーブル`
(
  `ネーションキー` integer,
  `ネーション名` string,
  `リージョンキー` integer,
  `コメント` string,
  update_date date
);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bb58f065-bc61-d7e8-a860-756edcc3e180.png)

```python
%sql
INSERT INTO `カタログ`.`スキーマ`.`テーブル`
(
  `ネーションキー`,
  `ネーション名`,
  `リージョンキー`,
  `コメント`,
  update_date
)
SELECT
  N_NATIONKEY
  ,N_NAME
  ,N_REGIONKEY 
  ,N_COMMENT
  ,CAST(current_timestamp AS date) AS update_date
  FROM
    read_files(
      'dbfs:/databricks-datasets/tpch/data-001/nation/nation.tbl',
      format => 'csv',
      sep => '|',
      schema => '
        N_NATIONKEY  integer
        ,N_NAME       string
        ,N_REGIONKEY  integer 
        ,N_COMMENT    string
      ')
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d397ca1a-5440-9320-b087-25acbe8d995f.png)

```python
spark.table('`カタログ`.`スキーマ`.`テーブル`').display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9d59955e-42fa-3851-121c-3971d29515a5.png)

#### ビューの作成

```python
%sql
CREATE VIEW `カタログ`.`スキーマ`.`ビュー`
AS
SELECT
  *
  FROM
    `カタログ`.`スキーマ`.`テーブル`
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/eec40093-648f-29d6-4a55-00c0eb7d46d9.png)

```python
spark.table('`カタログ`.`スキーマ`.`ビュー`').display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/35dc918f-7a7b-4126-99be-71d7ae92300f.png)

### Hive Meatstore

#### スキーマの作成

```python
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.`スキーマ`;
```

```text
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:javax.jdo.JDOException: Exception thrown when executing query : SELECT 'org.apache.hadoop.hive.metastore.model.MDatabase' AS NUCLEUS_TYPE,A0.`DESC`,A0.DB_LOCATION_URI,A0.`NAME`,A0.OWNER_NAME,A0.OWNER_TYPE,A0.DB_ID FROM DBS A0 WHERE A0.`NAME` = ?
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d32385f7-effe-d79f-c69d-3ce24d10e331.png)

```python
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.schema_01;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6c50c968-cdbb-3cff-4d0d-a046bcb3751d.png)

#### テーブルの作成

```python
%sql
CREATE OR REPLACE TABLE hive_metastore.schema_01.`テーブル`
(
  `ネーションキー` integer,
  `ネーション名` string,
  `リージョンキー` integer,
  `コメント` string,
  update_date date
);
```

```text
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table テーブル
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/aa7527bc-20c0-bd13-21c1-adf8a794f6e6.png)


```python
%sql
CREATE OR REPLACE TABLE hive_metastore.schema_01.table_01
(
  `ネーションキー` integer,
  `ネーション名` string,
  `リージョンキー` integer,
  `コメント` string,
  update_date date
);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/173fc677-c71a-3cdf-a698-4452ad5a4cf6.png)


```python
%sql
INSERT INTO hive_metastore.schema_01.table_01
(
  `ネーションキー`,
  `ネーション名`,
  `リージョンキー`,
  `コメント`,
  update_date
)
SELECT
  N_NATIONKEY
  ,N_NAME
  ,N_REGIONKEY 
  ,N_COMMENT
  ,CAST(current_timestamp AS date) AS update_date
  FROM
    read_files(
      'dbfs:/databricks-datasets/tpch/data-001/nation/nation.tbl',
      format => 'csv',
      sep => '|',
      schema => '
        N_NATIONKEY  integer
        ,N_NAME       string
        ,N_REGIONKEY  integer 
        ,N_COMMENT    string
      ')
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d2ba77a8-7ca8-593c-b6c0-c18ec61af7b6.png)


```python
%sql
SELECT
  *
  FROM
    hive_metastore.schema_01.table_01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/697e7613-59c3-4d25-d49d-f982c9961b58.png)

#### ビューの作成

```python
%sql
CREATE VIEW hive_metastore.schema_01.`ビュー`
AS
SELECT
  *
  FROM
    hive_metastore.schema_01.table_01
```

```text
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table ビュー
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/330afe59-08a3-08a0-3595-a294ef05ca8c.png)


```python
%sql
CREATE VIEW hive_metastore.schema_01.view_01
AS
SELECT
  *
  FROM
    hive_metastore.schema_01.table_01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/28b3b161-f1cd-1482-3854-da2b93799b5d.png)

```python
%sql
SELECT
  *
  FROM
    hive_metastore.schema_01.view_01
```

```text
AnalysisException: [INCOMPATIBLE_VIEW_SCHEMA_CHANGE] The SQL query of view `hive_metastore`.`schema_01`.`view_02` has an incompatible schema change and column ??????? cannot be resolved. Expected 2 columns named ??????? but got [].
Please try to re-create the view by running: CREATE OR REPLACE VIEW hive_metastore.schema_01.view_02  AS SELECT
  *
  FROM
    hive_metastore.schema_01.table_02.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d3663e2-0736-3320-0394-f2233d525f75.png)

カタログエクスプローラーで確認すると、次のように文字化けしていることを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5631c4bb-939a-f561-0928-421b3f9876c8.png)

また、ソースのカラムが日本語でないカラムを日本語にした場合にも想定通りに動作しませんでした。

```python
%sql
create or replace VIEW schema_01.vivew_02
AS
select
  "ab" AS `ネーションキー`
  ,"ab" AS `ネーション名`
  ,"ab" AS `リージョンキー`
  ,"ab" AS `コメント`
```

```python
%sql
SELECT
  `ネーションキー`
  ,`ネーション名`
  ,`リージョンキー`
  ,`コメント`
  FROM schema_01.vivew_02
```

```text
Error in SQL statement: AnalysisException: [UNRESOLVED_COLUMN.WITH_SUGGESTION] A column or function parameter with name `ネーションキー` cannot be resolved. Did you mean one of the following? [`????`, `??????`, `???????`, `???????`].; line 2 pos 2;
'Project ['ネーションキー, 'ネーション名, 'リージョンキー, 'コメント]
+- SubqueryAlias spark_catalog.schema_01.vivew_02
   +- View (`spark_catalog`.`schema_01`.`vivew_02`, [???????#5560,??????#5561,???????#5562,????#5563])
      +- Project [cast(???????#5556 as string) AS ???????#5560, cast(??????#5557 as string) AS ??????#5561, cast(???????#5558 as string) AS ???????#5562, cast(????#5559 as string) AS ????#5563]
         +- Project [ab AS ???????#5556, ab AS ??????#5557, ab AS ???????#5558, ab AS ????#5559]
            +- OneRowRelation
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dbcb1ad9-74f7-793d-274c-33b849aff268.png)


## リソースの削除

```python
%sql
DROP CATALOG `カタログ` CASCADE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/82b5c4b5-a023-75f5-0bc1-29a3cbef724e.png)

```python
%sql
DROP SCHEMA `schema_01` CASCADE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/414e45de-df34-fb40-f053-ae1122423be7.png)