1. チュートリアル

本章では、GridData Analyticsの利用例の一つとして、 RDBのデータの集計処理を行い、 またその処理内容をAPI化し、結果をJson形式で受け取るケースを説明します。 なお、Jupyter Notebookの操作方法やデータソースのアクセス方法、ライブラリの使用方法など、 各手順の詳細は、 GridData Analytics Studioの利用方法 の該当する項目を参照してください。

1.1. データを集計する

あらかじめ、以下のスキーマ構造を持つテーブルtesttableをMySQLで作成します。

カラム名 データ型
value INT
ts TIMESTAMP

(1)GridData Analytics StudioのJupyter Notebookのログイン画面にアクセスし、あらかじめ作成したユーザでログインします。

Jupyterのログイン画面

(2)ダッシュボード画面右上のNew→Python3を選択し、Python3カーネルのノートブックを新規作成します。

ダッシュボード画面

(3)データの分析

ノートブック画面にPythonコードを記述し、データ分析を行います。

コードの記述

今回の例では、以下のコードのように、MySQLに接続し一定期間の値を集計する処理のみを行います。

import pymysql

connection = pymysql.connect(host='localhost',
                     user='mysql',
                     password='mysql',
                     db='mysqldb',
                     cursorclass=pymysql.cursors.DictCursor)
connection.commit()
cur = connection.cursor()
# SQLの発行
cur.execute("SELECT sum(value) FROM testtable WHERE ts >= timestamp '2000-01-01 00:00:00'"+
    " AND ts <= timestamp '2100-01-30 00:00:00';")
# 結果の取得
rows = cur.fetchall()
# 接続を閉じる
cur.close
connection.close
# 結果の表示
sum=rows[0]['sum(value)']
sum=int(sum) if sum else 0
sum

コードを記述したのち、ノートブックを実行することで結果が表示されます。

1.2. データ集計機能をAPI化しサービス開発を行う

先の例で作成したコードを元に、集計の開始時刻と終了時刻をクエリパラメータとして受け取り、 集計結果をJSONとして返すWebAPIを作成します。

(1)コードの修正

先ほどのコードを以下のように変更します。

import pymysql
from flask import Flask, jsonify, make_response,request
import json
api = Flask(__name__)

@api.route("/")
def sum():
    # クエリパラメータを受け取る
    datefrom = request.args.get('from')
    dateto = request.args.get('to')
    datefrom = datefrom if datefrom else '2000-01-01 00:00:00'
    dateto  = dateto if dateto else '2100-01-01 00:00:00'
    # 接続情報を設定する
     connection = pymysql.connect(host='localhost',
                             user='mysql',
                             password='mysql',
                             db='mysqldb',
                             cursorclass=pymysql.cursors.DictCursor)
    connection.commit()
    cur = connection.cursor()
    # SQLの発行
    cur.execute("SELECT sum(value) FROM testtable WHERE ts >=  timestamp '"+datefrom+
        "' AND ts <= timestamp '"+dateto+"';")
    # 結果の取得
    rows = cur.fetchall()
    # 接続を閉じる
    cur.close
    connection.close
    # 結果の表示
    sum=rows[0]['sum(value)']
    sum=int(sum) if sum else 0
    result = {"data":{"from":datefrom,"to":dateto,"sum":sum}}
    return make_response(jsonify(result))

if __name__ == '__main__':
    # IPとポートを指定してAPIサーバを起動
    api.run(host='localhost', port=3000)

このとき、コード末尾にあるホスト名(localhost)はGridData Analytics StudioをインストールしたマシンのIPに変更します。

(2)ノートブック上でAPIサーバを起動する

上記のノートブックを実行することで、ノートブック上でAPIサーバが起動します。 起動後は、ブラウザやCurlコマンドを使用し、http://<マシンのIP>:3000/?from=2000-01-01+00:00:00&to=2001-01-01+00:00:00のように クエリを指定しAPIサーバにアクセスすることで、集計結果を以下のようにJson形式で受け取ることができます。

{
  "data": {
    "from": "2000-01-01 00:00:00",
    "sum": 550,
    "to": "2100-01-01 00:00:00"
  }
}

注釈

ノートブック上でAPIサーバを起動する場合はAPIの実行テストのために行い、本番環境での実行はしないでください。

(3)GridData Analytics Serverで APIサーバを起動する

あらかじめ、コード末尾にあるIPを、GridData Analytics ServerをインストールしたマシンのIPに変更します。

GridData Analytics Serverにノートブックを移動し、作成したノートブックtutorial.ipynbに対しgriddataユーザで以下のコマンドを実行します。 このときノートブック名(tutorial.ipynb)は実際の名前に変更してください。

上記のコマンドを実行することで、(2)と同様のAPIサーバがGridData Analytics Server上で起動します。

(4)jQueryでAPIを利用する

前述のAPIを元に、開始日時と終了日時を入力することで、その期間の集計結果を返すhtmlページをjQueryを使用し作成します。

$.getJSONを使用したhtmlの例は以下の通りです。

<!DOCTYPE html>
<html>
<head></head>
<body>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type=text/javascript>
  $(function() {
    $('a#getresult').bind('click', function() {
      $.getJSON('http://XX.XX.XX.XX:3000/', {
        from: $('input[name="from"]').val(),
        to: $('input[name="to"]').val()
      }, function(data) {
      var jsondata=data
        $("#result").text(JSON.stringify(jsondata));
      });
      return false;
    });
  });
</script>
<p>from:<input type=text size=20 name=from><br/>
 to:<input type=text size=20 name=to> <br/> result:
   <span id=result>?</span>
<p><a href=# id=getresult>get api result</a>
</body>
</html>

上記のhtmlにて、期間を入力し「get result」をクリックすることで、以下の画像のようにAPIの結果が表示されます。

コードの記述