Athenaでデータソースにクエリをする際にハマったこと
こんにちは、CX事業本部 IoT事業部の若槻です。
最近Amazon Athenaを久々に触っているのですが、Athenaからデータソースに対してクエリを実行する際に、次のエラーに遭遇してハマったので対処について書き残しておきます。
Column 'column' cannot be resolved
エラー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で使用する際にもクエリエンジンによる解釈に何らかの制限があり、末尾以外で指定するとエラーとなるのでしょうか。
以上