OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

時系列データを一定の時間間隔で処理する

公開日:
更新日:
基本操作
機械学習
#関数

はじめに

センサーデータやログデータといったのストリームデータ(時系列データ)を使用してリアルタイムに監視等を行う際、データ1件1件を監視するのではなく、以下のように一定の時間間隔(ウィンドウ)の集計結果を利用したい場合があります。
例)
・センサーログ:2秒間毎のセンサーの値を合計し、20以上の場合は機械に異常が発生していると判断する
・アクセスログ:5秒間毎のにログイン失敗回数を集計し、1000回以上の場合は不正アクセスの疑いがあると判断する

センサーの値を2秒間毎のウィンドウで集計するイメージ図
Windows処理イメージ

このような場合、VerticaではTIME_SLICE関数を利用することで一定時間間隔でデータをスライスできます。

TIME_SLICE

コマンド構文

dbadmin=> SELECT TIME_SLICE( expression,slice-length 
       ->                  [, 'time-‑unit' [, 'start‑or‑end' ] ] )
       -> FROM テーブル名;
パラメータ内容
expressionスライス処理をする対象のTIMESTAMP列
slice-length スライスする時間の間隔
time-‑unitslice-lengthの時間の単位
・HOUR
・MINUTE
・SECOND (デフォルト)
・MILLISECOND
・MICROSECOND
'start‑or‑end' slice-lengthの時間の先頭(START)か終端(END)どちらを起点とするか

・START (デフォルト)
・END

利用例

センサーデータがロードされるsensor_logテーブルを例にします。
ts列がログの発生時間、val列がセンサーの値です。

センサーデータの格納テーブル

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列の合計値を求めます。

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で確認しています。