Help us understand the problem. What is going on with this article?

Amazon Athena で no viable alternative at input への対処法

背景

以前からあるCloudTrailのログをAthenaで分析したいと思いクエリを投げましたが、クエリが重いのでなんとかしたいと思いました。

Partitionを分割して時間とコストを節約しようと考え、Athenaのテーブルを作成しなおそうと思ったら、no viable alternative at input 'create external' のようなエラーに遭遇。

Syntaxがおかしいっぽいことまではわかるのだけど、これだけじゃどこを直して良いのかわからない。。。

とりあえず、公式ドキュメントを確認。さすがよくまとまってます。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/create-table.html

DDL確認ポイント

公式ドキュメントから、確認ポイントを抜粋しました。
これらをひとつひとつチェックしていけば、ほぼ間違いなくエラーは消えるでしょう。

  • テーブル名に特殊文字(アンダースコア(_)以外)を使ってる
  • テーブル名を数値から始めている
  • カラム名に特殊文字(アンダースコア(_)以外)を使ってる
  • カラム名をクォートで囲っている
  • 括弧が足りない
  • アンダースコアから始まる名前がバックスラッシュで囲ってない
  • カンマが欠落している
  • 半角スペースが足りない
  • カラムやパーティション指定時に、最後のカンマが余計についている
  • パーティションのカラム名に、テーブルのカラム名と同じものが指定されている

テーブル名にハイフンを使いたくなるのはよくある話だけど、エラーになる。

で、自分の場合、全部チェックしたけどエラーは消えなかった。

なんで?:thinking:

自分がハマったところ

  • パラメータの順番が違う

ちなみに、自分が投げたクエリはこんな感じ。

CREATE EXTERNAL TABLE my_cloudtrail (
    eventVersion STRING,
    userIdentity STRUCT<
        type: STRING,
        principalId: STRING,
        arn: STRING,
        accountId: STRING,
        invokedBy: STRING,
        accessKeyId: STRING,
        userName: STRING,
        sessionContext: STRUCT<
            attributes: STRUCT<
                mfaAuthenticated: STRING,
                creationDate: STRING>,
            sessionIssuer: STRUCT<
                type: STRING,
                principalId: STRING,
                arn: STRING,
                accountId: STRING,
                userName: STRING>>>,
    eventTime STRING,
    eventSource STRING,
    eventName STRING,
    awsRegion STRING,
    sourceIpAddress STRING,
    userAgent STRING,
    errorCode STRING,
    errorMessage STRING,
    requestParameters STRING,
    responseElements STRING,
    additionalEventData STRING,
    requestId STRING,
    eventId STRING,
    resources ARRAY<STRUCT<
        arn: STRING,
        accountId: STRING,
        type: STRING>>,
    eventType STRING,
    apiVersion STRING,
    readOnly STRING,
    recipientAccountId STRING,
    serviceEventDetails STRING,
    sharedEventID STRING,
    vpcEndpointId STRING
)
PARTITIONED BY ( region STRING, year STRING )
COMMENT 'CloudTrail table for cloudtrail archive'
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://my-bucket-name/AWSLogs/my-account-id/CloudTrail/'
TBLPROPERTIES ('classification'='cloudtrail');

よくあるCloudTrailのログを元にAthenaにテーブルを作成するクエリ。
でも、これはエラーになる。

なぜなら、COMMENTとPARTITIONED BYの行の順番が逆だから

つまり、DDLステートメント CREATE TABLE はパラメーターの順序もチェックするので、COMMENTとPARTITIONED BYの行を入れ替えて実行すると、テーブルの作成が成功します。

まとめ

今回は、ドキュメントの読み方が良くなかったと反省しました。

簡易チェックには、Format Queryを使いましょう。
SQLを整形したタイミングで間違っていると、パッと見でだいぶ違和感ある感じに整形されるので気づきやすいと思います。

誰かが同じ道を踏んだ時に、お役に立てば幸いです。

szk3
My interests are AWS/GCP/VSCode/Node.js/TypeScript/golang/rust. My posts represent the views of the individual, not the official position of the organization.
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした