LoginSignup
0
0

More than 1 year has passed since last update.

AthenaのSQLでPandasのresampleのようなことを行う

Last updated at Posted at 2021-11-22

以下のようにAWS Data Wrangler使ってAthenaからロードした時系列データを時間単位毎に集計する処理を実行していました。

df.resample("min").mean()

よく考えればSQLでもWindow関数使えばできるよな。Athenaでもできるなかな。ということでAthena(というかPresto)のリファレンス読みながら探ってみました。

結論として date_trunc関数 を使うことで似たような実装が可能でした。以下にサンプルを書いておきます。

使うのは以下のsampleテーブルです。

Col Type Desc
time string ISO8601形式の文字列形式で入っている
value int サンプル値

WINDOW句で定義したもの使い回せなそうなのでPARTITION BYを何度も書くのが面倒ですが。

SELECT
  time,
  DATE_TRUNC('minute',from_iso_timestamp(time)),
  value,
  MAX(value) OVER (PARTITION BY DATE_TRUNC('minute',from_iso8601_timestamp(time)) ORDER BY time) AS value_max,
  MIN(value) OVER (PARTITION BY DATE_TRUNC('minute',from_iso8601_timestamp(time)) ORDER BY time) AS value_min,
  AVG(value) OVER (PARTITION BY DATE_TRUNC('minute',from_iso8601_timestamp(time)) ORDER BY time) AS value_avg,
  ROW_NUMBER() OVER (PARTITION BY DATE_TRUNC('minute',from_iso8601_timestamp(time)) ORDER BY time) AS row_num
FROM "sample"
ORDER BY time

上記のSQL実行してみた結果です。WINDOW関数慣れてない人向けに少し注釈付けています。

image.png

つまりはパーティションを作れば良いので、UNIXTIMESTAMP形式にしてEXCELのFLOOR関数のように特定の秒毎に切る方法もあります。

-- 15秒毎のパーティション作成
FLOOR(unix_timestamp/15) * 15

-- 30秒毎のパーティション作成
FLOOR(unix_timestamp/30) * 30

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0