Edited at

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

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

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

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


Athenaの仕様

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


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


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

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

大小文字が混在する列名 (profileURI) や大文字の列名が含まれているクエリは無効です。


Athena のテーブル、データベース、および列の名前に使用できる特殊文字はアンダースコアのみです。


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



ふむ、つまりはこういうことだと理解しました。


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


    • 小文字はOK

    • 大文字は小文字に変換される

    • 特殊文字はアンダースコア( _ )のみOK



  • 言い換えると、日本語は使用できない


日本語を指定する方法

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


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

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

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

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


createdatabaseddl.sql

CREATE DATABASE `テストデータベース`;



createtableddl.sql

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は使えない

 

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

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

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