ラズパイで取得したセンサー値をGoogleSpreadSheetsでグラフ化するのBigQuery蓄積編です。
前回まででラズパイのセンサー値は定期的にPub/Subにパブリッシュされるようになっています。
今回はそれをCloudFunctionsでサブスクライブしてBigQueryにインサートします。
今回は次の順に設定を行います。
-
BigQueryにテーブルを作る
- データセットを作成する
- テーブルを作成する
-
CloudFunctionsに関数を作る
- 関数を書く
- 関数を登録する
- 関数の処理結果を確認する
BigQueryにテーブルを作る
BigQueryにはデータセットというテーブルをまとめる単位があり、
テーブルはその中に作る必要があります。
よって今回はデータセットとテーブルを1つずつ作成します。
これらの正確なところは以下の公式で確認してください。
また記事内では設定に以下の名前を付けました。
サービス | 項目 | 名前 |
---|---|---|
BigQuery | データセット | sensor_dataset |
BigQuery | テーブル | sensor_table |
CloudFunctions | 関数 | raspi-comfort-sensor-function |
データセットを作成する
ウェブUIでBigQueryを選択すると次の画面が出てくるので
Create new datasetを選択します。
すると小窓が出てくるのでデータセット名とロケーションを指定します。
有効期限の指定はなんでもいいです。
以上でデータセットが出来ました。
テーブルを作成する
空のテーブルを1つ作成します。
データセットのプルダウンからCreate new tableを選択します。
次の画面でテーブル名、カラム名、カラムの型を指定します。
※ カラム名とカラムの型はサブスクライブするjsonと合致している必要があります。
以上でテーブルが出来ました。
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()がデータ受信時に呼ばれます。
{
"name": "raspi-comfort-sensor-pubsub2bigquery",
"version": "0.0.1",
"repository": "googleapis/nodejs-bigquery",
"dependencies": {
"@google-cloud/bigquery": "1.0.0"
}
}
/**
* 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のインラインエディタを使って登録します。
以上で登録完了です。
関数の処理結果を確認する
関数が想定通り動いているかどうか確認ためには、CloudFunctionsのログを
見るか、またはBigQueryのテーブルの中身を参照する必要があります。
例えばテーブルの中身は次のようなクエリをウェブUIで投げて参照します。
以上でセンサー値の蓄積まで確認できました。
次は グラフ化編 です。