はじめに
センサーデータやログデータといったのストリームデータ(時系列データ)を使用してリアルタイムに監視等を行う際、データ1件1件を監視するのではなく、以下のように一定の時間間隔(ウィンドウ)の集計結果を利用したい場合があります。例)
・センサーログ:2秒間毎のセンサーの値を合計し、20以上の場合は機械に異常が発生していると判断する
・アクセスログ:5秒間毎のにログイン失敗回数を集計し、1000回以上の場合は不正アクセスの疑いがあると判断する
センサーの値を2秒間毎のウィンドウで集計するイメージ図
このような場合、VerticaではTIME_SLICE関数を利用することで一定時間間隔でデータをスライスできます。
TIME_SLICE
コマンド構文
1 2 3 |
dbadmin=> SELECT TIME_SLICE( expression,slice-length -> [, 'time-‑unit' [, 'start‑or‑end' ] ] ) -> FROM テーブル名; |
パラメータ | 内容 |
---|---|
expression | スライス処理をする対象のTIMESTAMP列 |
slice-length | スライスする時間の間隔 |
time-‑unit | slice-lengthの時間の単位 ・HOUR ・MINUTE ・SECOND (デフォルト) ・MILLISECOND ・MICROSECOND |
'start‑or‑end' | slice-lengthの時間の先頭(START)か終端(END)どちらを起点とするか ・START (デフォルト) ・END |
利用例
センサーデータがロードされるsensor_logテーブルを例にします。ts列がログの発生時間、val列がセンサーの値です。
センサーデータの格納テーブル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
dbadmin=> SELECT * FROM sensor_log ; ts | val ------------------------+----- 2017-09-26 09:00:00.01 | 2 2017-09-26 09:00:00.34 | 5 2017-09-26 09:00:00.78 | 3 2017-09-26 09:00:01.05 | 2 2017-09-26 09:00:01.06 | 2 2017-09-26 09:00:01.41 | 4 2017-09-26 09:00:01.82 | 1 2017-09-26 09:00:02.23 | 1 2017-09-26 09:00:02.36 | 2 2017-09-26 09:00:03.25 | 5 2017-09-26 09:00:03.78 | 7 2017-09-26 09:00:03.98 | 8 2017-09-26 09:00:04.1 | 2 2017-09-26 09:00:04.21 | 2 2017-09-26 09:00:04.33 | 2 2017-09-26 09:00:05.02 | 2 2017-09-26 09:00:05.76 | 2 2017-09-26 09:00:05.92 | 2 (18 rows) |
TIME_SLICE関数とSUM関数を使用して2秒間隔毎のval列の合計値を求めます。
1 2 3 4 5 6 7 8 9 10 11 12 |
dbadmin=> SELECT TIME_SLICE(ts,2,'SECOND','START') AS timeslice, -> SUM(val) -> FROM sensor_log -> GROUP BY timeslice -> ORDER BY timeslice; timeslice | SUM ---------------------+----- 2017-09-26 09:00:00 | 19 2017-09-26 09:00:02 | 23 2017-09-26 09:00:04 | 12 (3 rows) |
このように、TIME_SLICE関数を使用することで、ストリームデータ(時系列データ)を簡単に一定の時間間隔に区切って処理することができます。
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。- 投稿タグ
- ストリーミング, ウィンドウ, time_slice, 時系列データ