Athenaでデータソースにクエリをする際にハマったこと

2021.12.07

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

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

最近Amazon Athenaを久々に触っているのですが、Athenaからデータソースに対してクエリを実行する際に、次のエラーに遭遇してハマったので対処について書き残しておきます。

  1. Column 'column' cannot be resolvedエラー
  2. mismatched input 'column'. Expecting: <EOF>エラー

前提

下記のようにAhenaのクエリエディターを使用してSELECTおよびFROM句を使用して正常にクエリできている前提とします。

SELECT eventname,
	dynamodb.approximatecreationdatetime as approximatecreationdatetime,
	dynamodb.newimage.deviceid.s as deviceid,
	dynamodb.newimage.devicename.s as devicename
FROM "gluedatabase"."gluetable"

ハマったこと

1.「Column 'column' cannot be resolved」エラー

事象

クエリでWHERE句を使ってレコードをフィルターしようとしました。

SELECT eventname,
	dynamodb.approximatecreationdatetime as approximatecreationdatetime,
	dynamodb.newimage.deviceid.s as deviceid,
	dynamodb.newimage.devicename.s as devicename
FROM "gluedatabase"."gluetable"
WHERE approximatecreationdatetime = 1638885030114

実行すると下記のようなエラーとなりました。

SYNTAX_ERROR: line 6:7: Column 'approximatecreationdatetime' cannot be resolved
This query ran against the "gluedatabase" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 09aba203-76f5-44b4-b586-f0adb8572b19

WHEREで指定したapproximatecreationdatetimeプロパティが解釈できていないようです。

解決

SELECTで出力したALIAS(approximatecreationdatetime)をWHERE句で指定できなかったためでした。なのでALIASでない元のプロパティ(dynamodb.approximatecreationdatetime)による指定したらエラーなく実行できました。

SELECT eventname,
	dynamodb.approximatecreationdatetime as approximatecreationdatetime,
	dynamodb.newimage.deviceid.s as deviceid,
	dynamodb.newimage.devicename.s as devicename
FROM "gluedatabase"."gluetable"
WHERE dynamodb.approximatecreationdatetime = 1638885030114

2.「mismatched input 'column'. Expecting: 」エラー

事象

LIMIT句を指定して取得レコードの上限を設けようとしたところ、クエリ実行がエラーとなりました。

SELECT eventname,
	dynamodb.approximatecreationdatetime as approximatecreationdatetime,
	dynamodb.newimage.deviceid.s as deviceid,
	dynamodb.newimage.devicename.s as devicename
FROM "gluedatabase"."gluetable"
LIMIT 2
WHERE dynamodb.approximatecreationdatetime = 1638885030114

line 7:1: mismatched input 'WHERE'. Expecting:

LIMITの後にWHERE句を指定するのが不適切だとのことです。

解決

LIMIT句はクエリの末尾で使う必要がありました。

WHEREの前にあったLIMIT句を末尾に記載します。

SELECT eventname,
	dynamodb.approximatecreationdatetime as approximatecreationdatetime,
	dynamodb.newimage.deviceid.s as deviceid,
	dynamodb.newimage.devicename.s as devicename
FROM "gluedatabase"."gluetable"
WHERE dynamodb.approximatecreationdatetime = 1638885030114
LIMIT 2

するとクエリがエラーなく実行できました。

AthenaにおけるLIMIT句

このLIMIT句をクエリ末尾で使わないといけないという仕様がどこから来ているのか気になりました。

Amazon Athenaのドキュメントを見てみましたが特に情報はありません。

LIMIT [ count | ALL ]
結果セットの行数を count に制限します。LIMIT ALL は LIMIT 句を省略した場合と同じです。クエリに ORDER BY 句がない場合は、任意の結果になります。

Amazon AthenaのクエリエンジンにはPrestoという分散SQLクエリ実行エンジンが使われています。そこでPrestoのドキュメントも見てみたのですが、こちらでも特に情報は見当たりませんでした。

もう少し調べてみると、どうやらLIMIT句はSQLにおいて標準的に使用できる文法ではないようです。例えばPostgreSQL、MySql、SQLiteでは使用可能、OracleやSQL Serverでは使えないそうです。

よってAthenaで使用する際にもクエリエンジンによる解釈に何らかの制限があり、末尾以外で指定するとエラーとなるのでしょうか。

以上