この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部の鈴木です。
今回は、Amazon Athenaで週次の集計を行う例を紹介します。
やりたいこと
時系列データを分析・利用する際に、ある程度まとまった期間で集計したいことがあります。
月次の場合は日付にある月の値を取得してGROUP BY
のグループキーに指定すれば良いですが、週次で集計を行う際には、日付から週を表す値を作る必要があります。
この方法として、Athena エンジンバージョン2が基づいているPresto 0.217のドキュメントのExtraction Functionのセクションに、week
関数を使った方法が記載されているので試してみました。
6.13. Date and Time Functions and Operators — Presto 0.217 Documentation
week
関数は、Date型を渡すことで、その日付のISO週番号を取得できます。
つまり、今回の週次
とはISO週番号で定義された週を意味することにご注意ください。
やってみる
以下のようなデータがあるとして、週次ごとにvalueの値を合計してみます。
timestamp, value
2021-05-26 01:00:00,100
2021-05-27 01:00:00,110
2021-06-03 01:00:00,115
2021-06-06 01:00:00,105
2021-06-16 01:00:00,95
2021-06-30 01:00:00,100
2021-07-22 01:00:00,105
まず、このデータをS3バケットにアップロードしておきます。
データはヘッダー付きのCSVファイルなので、以下のようにテーブルを作成します。
CREATE EXTERNAL TABLE `データベース名`.`テーブル名`(
`timestamp` STRING,
`value` INT)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'ファイルのある階層のS3 URL'
TBLPROPERTIES (
'skip.header.line.count'='1')
上記SQLをAthenaで実行し、テーブルができたところで、以下のSQLでデータを週次集計してみます。
with data_with_week_number AS (
SELECT
week(date_parse(timestamp, '%Y-%m-%d %H:%i:%s')) AS week_number,
value
FROM "データベース名"."テーブル名"
)
SELECT
sum(value) AS total,
week_number
FROM data_with_week_number
GROUP BY week_number
ORDER BY week_number
ポイントは以下になります。
- timestampカラムを
date_parse
関数でDate型にする。 - Date型に変換したtimestampカラムの値から、
week
関数でISO週番号を取得し、week_numberカラムとする。 - week_numberカラムをグループキーに
GROUP BY
する。
結果は以下のようになり、週番号ごとに値を合計することができました。
最後に
AthenaでISO週番号を使った週次集計の例を紹介しました。
ご存知の方だと当たり前の方法かもしれませんが、調べたところ、意外と情報がなかったので記事にしてみました。
どこかで誰かのお役に立てば幸いです。