Symfoware

Symfowareについての考察blog

GridDB TimeSeriesなコレクションからデータを取得する

GridDBをインストールし、Javaから接続してみました。
GridDBをCentOS 7.2にインストール
GridDBにJavaクライアントから接続し、クエリーを実行する


ドキュメントを見てみると、時系列なデータを扱うときに
このデータベースの本領が発揮される模様。


TimeSeries



時系列を扱う場合は、「TimeSeries」という専用のコレクションを作成するようです。
サンプルのままですが、以下のプログラムを実行してみます。


  1. package sample;
  2. import java.util.Date;
  3. import java.util.Properties;
  4. import com.toshiba.mwcloud.gs.GSException;
  5. import com.toshiba.mwcloud.gs.GridStore;
  6. import com.toshiba.mwcloud.gs.GridStoreFactory;
  7. import com.toshiba.mwcloud.gs.RowKey;
  8. import com.toshiba.mwcloud.gs.RowSet;
  9. import com.toshiba.mwcloud.gs.TimeSeries;
  10. import com.toshiba.mwcloud.gs.TimeUnit;
  11. import com.toshiba.mwcloud.gs.TimestampUtils;
  12. public class Sample2 {
  13.     
  14.     // 保存するオブジェクト
  15.     static class Point {
  16.         @RowKey Date timestamp;
  17.         boolean active;
  18.         double voltage;
  19.     }
  20.     
  21.     public static void main(String[] args) throws GSException {
  22.         // GridDBへの接続指定
  23.         Properties props = new Properties();
  24.         props.setProperty("notificationAddress", "239.0.0.1");
  25.         props.setProperty("notificationPort", "31999");
  26.         props.setProperty("clusterName", "my_cluster");
  27.         props.setProperty("user", "admin");
  28.         props.setProperty("password", "P@ssw0rd");
  29.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  30.         // TimeSeriesなコレクションを作成
  31.         TimeSeries<Point> ts = store.putTimeSeries("point01", Point.class);
  32.         // 保存用のデータ
  33.         Point point = new Point();
  34.         point.active = false;
  35.         point.voltage = 100;
  36.         // データの登録
  37.         ts.append(point);
  38.         // 検索条件の時間範囲を作成
  39.         Date now = TimestampUtils.current();
  40.         Date before = TimestampUtils.add(now, -6, TimeUnit.HOUR);
  41.         RowSet<Point> rs = ts.query(before, now).fetch();
  42.         while (rs.hasNext()) {
  43.             point = rs.next();
  44.             System.out.println(
  45.                     "Time=" + TimestampUtils.format(point.timestamp) +
  46.                     " Active=" + point.active +
  47.                     " Voltage=" + point.voltage);
  48.         }
  49.         // 接続終了
  50.         store.close();
  51.     }
  52. }




TimeSeriesなコレクションにデータを登録する場合は、
「timestamp」というフィールドを用意。
登録するときにtimestampを指定しなくても、自動的に値が設定されるようです。


1回実行すると、検索結果は1行。


Time=2016-03-06T07:40:20.998Z Active=false Voltage=100.0




2回実行すると検索結果は2行表示されます。


Time=2016-03-06T07:40:20.998Z Active=false Voltage=100.0
Time=2016-03-06T07:40:40.921Z Active=false Voltage=100.0







範囲の開始、終了を取得



上記のプログラム、voltageを適当に変化させて複数回実行しておきました。


Time=2016-03-06T07:40:20.998Z Active=false Voltage=100.0
Time=2016-03-06T07:40:40.921Z Active=false Voltage=100.0
Time=2016-03-06T07:49:16.539Z Active=false Voltage=100.0
Time=2016-03-06T07:49:26.550Z Active=false Voltage=100.0
Time=2016-03-06T07:49:36.562Z Active=false Voltage=30.0
Time=2016-03-06T07:49:41.568Z Active=false Voltage=30.0
Time=2016-03-06T07:50:31.628Z Active=false Voltage=100.0
Time=2016-03-06T07:50:36.634Z Active=false Voltage=95.0
Time=2016-03-06T07:50:41.640Z Active=false Voltage=90.0
Time=2016-03-06T07:50:46.647Z Active=false Voltage=30.0
Time=2016-03-06T07:54:06.999Z Active=false Voltage=25.0




Voltageが50を超えたデータを取得。
その前後10分間のデータを取得し、Voltageの平均値を求めます。


  1. package sample;
  2. import java.util.Date;
  3. import java.util.Properties;
  4. import com.toshiba.mwcloud.gs.Aggregation;
  5. import com.toshiba.mwcloud.gs.AggregationResult;
  6. import com.toshiba.mwcloud.gs.GSException;
  7. import com.toshiba.mwcloud.gs.GridStore;
  8. import com.toshiba.mwcloud.gs.GridStoreFactory;
  9. import com.toshiba.mwcloud.gs.Query;
  10. import com.toshiba.mwcloud.gs.RowKey;
  11. import com.toshiba.mwcloud.gs.RowSet;
  12. import com.toshiba.mwcloud.gs.TimeOperator;
  13. import com.toshiba.mwcloud.gs.TimeSeries;
  14. import com.toshiba.mwcloud.gs.TimeUnit;
  15. import com.toshiba.mwcloud.gs.TimestampUtils;
  16. public class Sample3 {
  17.     static class Point {
  18.         @RowKey Date timestamp;
  19.         boolean active;
  20.         double voltage;
  21.     }
  22.     public static void main(String[] args) throws GSException {
  23.         
  24.         // GridDBへの接続指定
  25.         Properties props = new Properties();
  26.         props.setProperty("notificationAddress", "239.0.0.1");
  27.         props.setProperty("notificationPort", "31999");
  28.         props.setProperty("clusterName", "my_cluster");
  29.         props.setProperty("user", "admin");
  30.         props.setProperty("password", "P@ssw0rd");
  31.         props.setProperty("consistency", "EVENTUAL");
  32.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  33.         // TimeSeriesなコレクションを取得
  34.         TimeSeries<Point> ts = store.getTimeSeries("point01", Point.class);
  35.         // active = false, voltage > 50なデータを取得
  36.         Query<Point> query = ts.query(
  37.                 "select * from point01" +
  38.                 " where not active and voltage > 50");
  39.         RowSet<Point> rs = query.fetch();
  40.         while (rs.hasNext()) {
  41.             // 結果を取得
  42.             Point hotPoint = rs.next();
  43.             Date hot = hotPoint.timestamp;
  44.             // 10分前
  45.             Date start = TimestampUtils.add(hot, -10, TimeUnit.MINUTE);
  46.             Point startPoint = ts.get(start, TimeOperator.NEXT);
  47.             // 10分後
  48.             Date end = TimestampUtils.add(hot, 10, TimeUnit.MINUTE);
  49.             
  50.             // 平均値を取得
  51.             AggregationResult avg =
  52.                 ts.aggregate(start, end, "voltage", Aggregation.AVERAGE);
  53.             System.out.println(
  54.                     "[Alert] " + TimestampUtils.format(hot) +
  55.                     " start=" + startPoint.voltage +
  56.                     " hot=" + hotPoint.voltage +
  57.                     " avg=" + avg.getDouble());
  58.         }
  59.         // 接続終了
  60.         store.close();
  61.     }
  62. }




実行結果


[Alert] 2016-03-06T07:40:20.998Z start=100.0 hot=100.0 avg=76.66666666666667
[Alert] 2016-03-06T07:40:40.921Z start=100.0 hot=100.0 avg=81.875
[Alert] 2016-03-06T07:49:16.539Z start=100.0 hot=100.0 avg=72.72727272727273
[Alert] 2016-03-06T07:49:26.550Z start=100.0 hot=100.0 avg=72.72727272727273
[Alert] 2016-03-06T07:50:31.628Z start=100.0 hot=100.0 avg=70.0
[Alert] 2016-03-06T07:50:36.634Z start=100.0 hot=95.0 avg=70.0
[Alert] 2016-03-06T07:50:41.640Z start=100.0 hot=90.0 avg=66.66666666666667




センサーデータのログ解析など、便利になりそうです。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/03/06(日) 16:58:13|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<GridDB 画像データのバイナリ(BLOB型)を保存する | ホーム | GridDBにJavaクライアントから接続し、クエリーを実行する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1865-48343808
この記事にトラックバックする(FC2ブログユーザー)