[AWS Glue]データカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできない

2020.12.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

今回は、AWS Glueでデータカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできずハマった話をご紹介します。

事象

AWS Glueのデータカタログとして、名前にハイフン(-)を含むテーブルs3-outputをAWS CLIで下記のように作成しました。

% touch tableinput.json

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"

image

しかし、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)

image

原因・解決

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

image

今回のハマりどころ

名前にハイフンを使ったテーブルの作成は、Athenaのコンソールからだとちゃんと有効なテーブル名ではありません。というエラーとなり作成できません。 image

しかしAWS CLIおよびCloudFormationだとエラーなく作成できてしまうため、今回ハマってしまいました。

おわりに

AWS Glueでデータカタログのテーブル名にハイフンが含まれていると特定コマンドの対象にできずハマった話のご紹介でした。

公式ドキュメントで制限やベストプラクティスをあらかじめ確認しておくのは大事ですね。

参考

以上