Amazon Athenaで作成するデータベース名、テーブル名、列名に日本語を使ってみた

Amazon Athenaで作成するデータベース名、テーブル名、列名に日本語を使ってみた:

Athenaでは事前にデータベースおよびテーブルを定義しておく必要がありますが、その際に指定する名前に日本語が使えるのか気になったので、試してみました。

Athenaについては、以下のページにて簡単にまとめましたので、ご確認ください。

Amazon Athenaにおける文字コードの考え方 -Athenaとは?-


Athenaの仕様

Athenaにおける各要素の命名について、公式ドキュメントを確認したところ、以下の記載がありました。

Athena のテーブル名とテーブルの列名は小文字にする必要があります。

Apache Spark を使用する場合は、テーブル名とテーブルの列名を小文字にする必要があります。

Athena では大文字と小文字を区別せず、テーブル名と列名を小文字に変換しますが、Spark には最初から小文字のテーブル名と列名が必要です。

大小文字が混在する列名 (profileURI) や大文字の列名が含まれているクエリは無効です。
Athena のテーブル、データベース、および列の名前に使用できる特殊文字はアンダースコアのみです。

Athena のテーブル、データベース、および列の名前にアンダースコア (_) 以外の特殊文字を含めることはできません。
ふむ、つまりはこういうことだと理解しました。

  • テーブル、データベース、および列名には以下の制約がある

    • 小文字はOK
    • 大文字は小文字に変換される
    • 特殊文字はアンダースコア( _ )のみOK
  • 言い換えると、日本語は使用できない


日本語を指定する方法

上記のとおり、公式では日本語は使えないと読める記述がありましたが、ちょっとした工夫で日本語を指定することができました。


データベース、テーブル作成DDL

結論から言えば、データベース、テーブル、列名をバッククォート( ` )で囲んだDDLであれば日本語で作成できちゃいます

※日本語のほか、アンダースコア( _ )以外の特殊文字も指定できることを一部確認しました

※ダブルクォートやシングルクォートで囲んだり、囲み無しの場合はエラーとなりました

createdatabase.DDL
CREATE DATABASE `テストデータベース`; 
createtable.DDL
CREATE EXTERNAL TABLE IF NOT EXISTS `テストデータベース`.`テストテーブル` ( 
  `名前` string, 
  `メールアドレス` string, 
  `性別` string, 
  `年齢` int 
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SERDEPROPERTIES ( 
  'serialization.format' = ',', 
  'field.delim' = ',' 
) 
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'  
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'  
LOCATION 's3://<スキャン対象のデータがあるS3の場所>/' 
TBLPROPERTIES ( 
  'has_encrypted_data'='false', 
  'skip.header.line.count'='1' ←スキャンデータにヘッダーが含まれている場合は必要 
) 
上記のクエリを実行した結果がこちら。


DDLResult.png


ご覧の通り、ちゃんと日本語名のデータベース、テーブルが作成されています。


日本語名テーブルへのクエリ

上記で作成したテーブルへクエリを投げる際も、少しだけ工夫が必要です。

SELECT * FROM テストデータベース.テストテーブル;だとエラーになります。

かと言ってSELECT * FROM `テストデータベース`.`テストテーブル`;とすると、エラーにはなりませんが、レコードがうまく返ってきません。

結論としては、SELECT * FROM "テストデータベース"."テストテーブル";のように、データベース、テーブル名をダブルクォート( " )で囲んであげると、以下のようにレコードが返ってきます


SQLResult.png


※そういえば、列名もちゃんと日本語になってますね


日本語名のテーブルを使うことによる不都合

テーブル名を指定する以下のDDLでエラーが発生しました。

  • DESCRIBE `<日本語テーブル名>`
  • ALTER TABLE `<日本語テーブル名>` ADD PARTITION (<パーティション句>)
DROP TABLE `<日本語テーブル名>`は使えたので、日本語名のテーブルを作成できるけど削除できない、なんてカオスな事態にはならないようで安心しました。

が、パーティション切れないのは正直イタいですね。。。


まとめ

  • Athenaでは、テーブル、データベース、および列名に日本語やアンダースコア( _ )以外の特殊文字を使用することはサポートされていない
  • 定義時にデータベース、テーブル、列名をバッククォート( ` )で囲むことで、日本語や特殊文字の指定が可能
  • 日本語名のテーブルに対して、ADD PARTITIONは使えない


所詮はサポートされていない非公式な定義方法なので、

「どうしても日本語で定義したい、かつパーティション切るほどでもない」

といったニーズがある場合(そんなニーズあるのかは置いといて)は、今回お伝えした方法を試してもらえればと思います。

コメント

このブログの人気の投稿

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-04-30 23:37:32 RSSフィード2021-04-30 23:00 分まとめ(42件)

投稿時間:2023-02-05 02:09:04 RSSフィード2023-02-05 02:00 分まとめ(9件)