Lambda + node + Athena

表題の環境でハマったのでメモとして残しておく。

■ 環境

  • Node.js 8.10
  • AWS Lambda
  • AWS Athena

■ node

新規でLambdaの関数を”一から作成“で作成した際に、下記のコードが作成されたのでこれを元に処理を追加していった。

exports.handler = async (event) => {
    // TODO implement
    return 'Hello from Lambda!'
};

LambdaからAthenaに`startQueryExecution`でクエリを実行させ、S3にCSVが作成された、満足だ、と安心し更に実装を進めていたら、`startQueryExecution`の箇所はほぼ修正していないのに実行ができなくなってしまった…。その後、ファイルのversionを戻しても実行がされない…。`listNamedQueries`を実行してみても結果を得られない…。

  1. 実行できた時点のversionを再実行
  2. `startQueryExecution`を`listNamedQueries`にして実行
  3. 関数を新規に作成して実行

ここまで実行してもやはり実行はできなかった。エラーも出ていない、CloudWatchログで見ても実行時のエラーは出ていない。手詰まり…となったがふと思いたってランタイムを”Node.js 6.10“にして実行してみた。実行してみるとエラーが発生。`async`がダメというような内容であった。

従って、上記のサンプルでいうと下記のように修正した。

exports.handler = (event) => {
    // TODO implement
    return 'Hello from Lambda!'
};

実行できてしまった…。`listNamedQueries`も`startQueryExecution`も問題なく実行ができた。

もしや?と思いこのソースのままランタイムを”Node.js 8.10“に変更しても問題なく実行ができた。

変な箇所にハマって時間をくってしまったので原因を深く追求するのはやめて実装を進めることにする。

以上。

経過日数を取得

Athenaで表題を行いたい。

■ 環境

  • AWS Athena

■ MySQL

MySQLでいうところの下記をやりたい。

MySQL :: 12.7 日付および時間関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_datediff

Athenaでもあるかと思ったが、そんな関数はないとエラーとなってしまった。

■ presto

そういえば”Athena“は”presto“であったっけ?と思い出してこちらで確認してみる。

6.13 Date and Time Functions and Operators
https://prestodb.io/docs/current/functions/datetime.html

`date_diff()`が存在した。

presto“のマニュアルによると下記のように行けるかと思ったがエラーとなった。

date_diff('d', day1, day2)

試行錯誤してみると下記で無事実行できた。

date_diff('day', day1, day2)

以上。

■ 関連

AthenaでDATE型

AthenaでDATE型

表題の通り。使用できたのでメモ。

■ 環境

  • Amazon Athena

■ DATE型

パーティションは年月日で作成している。またテーブル作成時の定義では、DATE型の選択肢が無いので使えないものだと思い込んでいた。

select 
  id
  :
  , cast(concat(year, '-', month, '-', day) as date) as ymd
from example
  :

ということができた。

以上。

■ 関連

経過日数を取得

AthenaでDIVが使えない

AWS Athenaで表題の通り。数値計算で`DIV`を使いたかったのだがダメだった。

■ 環境

  • AWS Athena

■ DIV

Athenaではパーティションを年月日で分けている。この月の値を元に、該当の月は何Q(四半期)であるのかを一緒に算出させたかったので`DIV`でいけるかな?と思ったところ、下記のようなエラーとなった。

Error running query: An error occurred (InvalidRequestException) when calling the StartQueryExecution operation: Queries of this type are not supported

`QUARTER`関数は使えるようなのだが、年月を元にtimestampに変換して…というのが少々面倒だったのとAthenaではやったことがなかったので下記のようにしてしまった。

select month, (month - 1) / 3 + 1 as quarter from ...

上記でとりあえず欲しい値は取得できたので良しとする。

以上。

複数のcount()の結果を四則演算

SQLにおいて表題のことをやりたかった。

■ 環境

  • Amazon Athena

■ count()

単純に”count()“の結果を計算するのであれば特に問題なくできるのだが、1つのクエリで複数の”count()“を実行し、その結果を使って四則演算したかった。

SELECT
  regist_date,
  count(1) as total,
  count(column1 < 10 or null) as count1, count(column1 >= 10 or null) as count2
FROM testtable
GROUP BY regist_date

以前使用した上記のSQLであれば、下記のようなことを行いたい。

count1 + count2

これを一度のクエリでは書けないので下記のようにすれば一応実行はできる。

SELECT regist_date, total, count1 + count2 as count3
FROM (
  SELECT
    regist_date,
    count(1) as total,
    count(column1 < 10 or null) as count1, count(column1 >= 10 or null) as count2
  FROM testtable
  GROUP BY regist_date
)

まぁ確かにできるのだがもっとスマートな書き方はないのかな。

以上。

■ 関連

複数条件のcount()