概要
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
カタログの作成
%sql
CREATE CATALOG IF NOT EXISTS `カタログ`;
スキーマの作成
%sql
CREATE SCHEMA IF NOT EXISTS `カタログ`.`スキーマ`;
テーブルの作成
%sql
CREATE OR REPLACE TABLE `カタログ`.`スキーマ`.`テーブル`
(
`ネーションキー` integer,
`ネーション名` string,
`リージョンキー` integer,
`コメント` string,
update_date date
);
%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
')
;
spark.table('`カタログ`.`スキーマ`.`テーブル`').display()
ビューの作成
%sql
CREATE VIEW `カタログ`.`スキーマ`.`ビュー`
AS
SELECT
*
FROM
`カタログ`.`スキーマ`.`テーブル`
spark.table('`カタログ`.`スキーマ`.`ビュー`').display()
Hive Meatstore
スキーマの作成
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.`スキーマ`;
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` = ?
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.schema_01;
テーブルの作成
%sql
CREATE OR REPLACE TABLE hive_metastore.schema_01.`テーブル`
(
`ネーションキー` integer,
`ネーション名` string,
`リージョンキー` integer,
`コメント` string,
update_date date
);
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table テーブル
%sql
CREATE OR REPLACE TABLE hive_metastore.schema_01.table_01
(
`ネーションキー` integer,
`ネーション名` string,
`リージョンキー` integer,
`コメント` string,
update_date date
);
%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
')
;
%sql
SELECT
*
FROM
hive_metastore.schema_01.table_01
ビューの作成
%sql
CREATE VIEW hive_metastore.schema_01.`ビュー`
AS
SELECT
*
FROM
hive_metastore.schema_01.table_01
AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table ビュー
%sql
CREATE VIEW hive_metastore.schema_01.view_01
AS
SELECT
*
FROM
hive_metastore.schema_01.table_01
%sql
SELECT
*
FROM
hive_metastore.schema_01.view_01
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.
カタログエクスプローラーで確認すると、次のように文字化けしていることを確認。
また、ソースのカラムが日本語でないカラムを日本語にした場合にも想定通りに動作しませんでした。
%sql
create or replace VIEW schema_01.vivew_02
AS
select
"ab" AS `ネーションキー`
,"ab" AS `ネーション名`
,"ab" AS `リージョンキー`
,"ab" AS `コメント`
%sql
SELECT
`ネーションキー`
,`ネーション名`
,`リージョンキー`
,`コメント`
FROM schema_01.vivew_02
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
リソースの削除
%sql
DROP CATALOG `カタログ` CASCADE;
%sql
DROP SCHEMA `schema_01` CASCADE;