LoginSignup
0
0

More than 5 years have passed since last update.

ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化する【BigQuery蓄積編】(3/4)

Last updated at Posted at 2018-07-04

ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化するのBigQuery蓄積編です。

前回まででラズパイのセンサー値は定期的にPub/Subにパブリッシュされるようになっています。
今回はそれをCloudFunctionsでサブスクライブしてBigQueryにインサートします。

図にすると次の通りです。
image.png

今回は次の順に設定を行います。

BigQueryにテーブルを作る

BigQueryにはデータセットというテーブルをまとめる単位があり、
テーブルはその中に作る必要があります。

よって今回はデータセットとテーブルを1つずつ作成します。
これらの正確なところは以下の公式で確認してください。

また記事内では設定に以下の名前を付けました。

サービス 項目 名前
BigQuery データセット sensor_dataset
BigQuery テーブル sensor_table
CloudFunctions 関数 raspi-comfort-sensor-function

データセットを作成する

ウェブUIでBigQueryを選択すると次の画面が出てくるので
Create new datasetを選択します。

image.png

すると小窓が出てくるのでデータセット名とロケーションを指定します。
有効期限の指定はなんでもいいです。

image.png

以上でデータセットが出来ました。

テーブルを作成する

空のテーブルを1つ作成します。
データセットのプルダウンからCreate new tableを選択します。

image.png

次の画面でテーブル名、カラム名、カラムの型を指定します。
※ カラム名とカラムの型はサブスクライブするjsonと合致している必要があります。

image.png

以上でテーブルが出来ました。

CloudFunctionsに関数を作る

CloudFunctionsは サーバーレスなNode.jsランタイム環境 です。

今回はサブスクライブ(push配信)がトリガーとなってCloudFunctionsの
関数が起動し、データをBigQueryにインサートするようにします。

メモ (その1)

公式の push配信とpull配信 によるとPub/Subデータが多い場合
(1秒間に1個超)は、pull配信を選択するよう記載されています。

CloudFunctionsはpush配信になるので、もしそのような要件なら
代わりに CloudDataflow を選択せよということだと思います。

メモ (その2)

今回は無視していますが at-least-once配信 によると関数は
べき等 である必要があります。

関数を書く

下記のリファレンスなどを参考にセンサー値を
BigQueryにインサートする関数を作ります。

出来たソースは次の2つです。
subscribe()がデータ受信時に呼ばれます。

package.json
{
  "name": "raspi-comfort-sensor-pubsub2bigquery",
  "version": "0.0.1",
  "repository": "googleapis/nodejs-bigquery",
  "dependencies": {
    "@google-cloud/bigquery": "1.0.0"
  }
}
index.js
/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event The Cloud Functions event.
 * @param {!Function} The callback function.
 */
exports.subscribe = function subscribe(event, callback) {

  //----------------------------
  // payloadを取得
  //----------------------------
  const payload = Buffer.from(event.data.data, 'base64').toString()

  //----------------------------
  // insert
  //----------------------------
  const BigQuery = require('@google-cloud/bigquery');
  const bigquery = BigQuery({ projectId: 'raspi-comfort-sensor' });

  bigquery
    .dataset('sensor_dataset')
    .table('sensor_table')
    .insert(JSON.parse(payload))

  .then(function(result) {

    console.log('BQ INSERTED : ' + payload);
    callback();
  })
  .catch((err) => {
    console.error('BQ ERROR : ', err);
    callback(1);
  });
};

関数を登録する

ウェブUIのインラインエディタを使って登録します。

image.png

以上で登録完了です。

関数の処理結果を確認する

関数が想定通り動いているかどうか確認ためには、CloudFunctionsのログを
見るか、またはBigQueryのテーブルの中身を参照する必要があります。

例えばテーブルの中身は次のようなクエリをウェブUIで投げて参照します。

image.png

以上でセンサー値の蓄積まで確認できました。

次は グラフ化編 です。

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