前回の記事まででRaspberry Piで作ったIoTデバイスから送信されたデータをS3などに保存することができました。
このデータをAWSのAthenaを使って分析してみようと思います。(DynamoDBにも格納しているので、そこで見た方が早そうですが、ネタとしてはAthenaの方が面白いので・・・。)
Athenaを使うとS3に格納しているJSONやCSVなどのデータを対象に、生データのままの状態でSQLを実行することができます。処理時間が少しかかるので常用には向かないかもしれませんが、アドホックで分析して、定期的なチェックが必要な項目などが分かったら、あとはRedshiftやRDSなどに構造化データとして加工して格納して使うというのが一般的かと思います。
Athenaのテーブル作成
早速、Athenaでテーブルを作ります。S3の生データでそのままSQLが実行できるといっても、スキーマ定義は必要です。ただ、スキーマを作ったからといって、S3のデータを別のストレージにコンバートして移すといったことをするわけではないので、アドホックな分析に向いているといえます。
Create tableをクリックして現れるサブメニューから、今回はManualを選択します。
まず、データベース名、テーブル名と、生データの格納先のS3バケットの指定です。バケット内のフォルダまで指定でき、そのフォルダが年月日などで階層構造になっている場合は、自動的に階層構造の下まで見に行ってくれます。
ファイルフォーマットの指定です。今回はJSONを指定します。
項目名と型を指定します。JSONのキーをそのまま項目名として指定します。型の指定はtimestamp型がちょっと難しくて、今回のJSONデータでのISO8601形式には対応していません。そのため、一旦、string型として認識させます。
任意でパーティションの指定ができますが、今回はそのまま。
テーブルが出来た後で、プレビューしてみます。
ちゃんと表示されました。
日時を含む表示と検索
先ほど、timestamp項目をstring型として認識させたのですが、きちんと日時として処理するためにはどうすれば良いでしょうか。
幸い、from_iso8601_timestamp
関数を使用すると、日時型に変換して処理されるようになり、タイムゾーンを変換しての表示や、条件指定(ここでは並べ替え)も可能になります。
SELECT
serial_no,
from_iso8601_timestamp(timestamp) AT TIME ZONE 'Asia/Tokyo' time_jst ,
temp,
light,
sound
FROM "iot"."statuses"
ORDER BY time_jst ASC
limit 10;
きちんと、日本時間で表示され、並べ替えも有効になっています。
昨日からの最高・最低気温(室温)を見る
昨日の14時くらいからデータを取り始めて、気温(室温)の最高・最低を見てみました。
まず、最高室温は昨日の19時14分の27.1度。別の部屋にいたのでエアコンを切っているからですかね。
最低は昨日の14時46分の24.9度。エアコンを使っているので冷えています。エアコンの設定温度は27度だったと思うのですが、センサーで取った値はもう少し低く出ているようです。
ということで、一通りの分析ができました。