AWS IoTでS3に蓄積したログをAthenaでアドホック分析

前回の記事までで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度だったと思うのですが、センサーで取った値はもう少し低く出ているようです。

ということで、一通りの分析ができました。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。