[AWS Glue]データカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできない
こんにちは、CX事業本部の若槻です。
今回は、AWS Glueでデータカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできずハマった話をご紹介します。
事象
AWS Glueのデータカタログとして、名前にハイフン(-
)を含むテーブルs3-output
をAWS CLIで下記のように作成しました。
% touch tableinput.json
{ "Name": "s3-output", "StorageDescriptor": { "Columns": [ { "Name": "9th_rank", "Type": "int" }, { "Name": "name", "Type": "string" }, { "Name": "type", "Type": "string" } ], "Location": "s3://<bucket-name>/data/", "InputFormat": "org.apache.hadoop.mapred.TextInputFormat", "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", "SerdeInfo": { "SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", "Parameters": { "field.delim": ",", "serialization.format": "," } } }, "Parameters": { "skip.header.line.count": "1", "EXTERNAL": "TRUE", "has_encrypted_data": "false", "serialization.encoding": "utf-8" } }
% tableinput=$(cat tableinput.json) % aws glue create-table --database-name tempdb --table-input $tableinput
作成したテーブルに対してAthenaからSelect
クエリを実行すると正常に実行できます。
SELECT * FROM "default"."s3-output"
しかし、MSCK REPAIR TABLE
コマンドを実行してパーティションを更新しようとすると、下記のいずれでもmismatched input 'msck' expecting
というエラーとなりました。
MSCK REPAIR TABLE "default"."s3-output"
MSCK REPAIR TABLE default.s3-output
line 1:1: mismatched input 'msck' expecting {'(', 'select', 'desc', 'using', 'with', 'values', 'create', 'table', 'insert', 'delete', 'describe', 'grant', 'revoke', 'explain', 'show', 'use', 'drop', 'alter', 'set', 'reset', 'start', 'commit', 'rollback', 'call', 'prepare', 'deallocate', 'execute'} (service: amazonathena; status code: 400; error code: invalidrequestexception; request id: a50b46fb-daa9-4587-b745-cf509de99bbc)
原因・解決
AWS Glueのプラクティスに則っていないことが原因でした。ハイフンの使用は非推奨で、代わりにアンダースコア(_
)を使うべきであったようです。
The only acceptable characters for database names, table names, and column names are lowercase letters, numbers, and the underscore character.
ハイフンの代わりにアンダースコアを名前に使ったテーブルに対してであれば、MSCK REPAIR TABLE
コマンドは正常に実行できました。
MSCK REPAIR TABLE default.s3_output
今回のハマりどころ
名前にハイフンを使ったテーブルの作成は、Athenaのコンソールからだとちゃんと有効なテーブル名ではありません。
というエラーとなり作成できません。
しかしAWS CLIおよびCloudFormationだとエラーなく作成できてしまうため、今回ハマってしまいました。
おわりに
AWS Glueでデータカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできずハマった話のご紹介でした。
公式ドキュメントで制限やベストプラクティスをあらかじめ確認しておくのは大事ですね。
参考
- AWS Glueデータカタログへのテーブルの作成とAthenaでのクエリ実行をAWS CLIでやってみた | Developers.IO
- MSCK REPAIR TABLE - Amazon Athena
以上