こんにちは、データアナリティクスチームのハガーです。

 

私はElastic StackのKibanaを使用して可視化することが多いのですが、今回Amazon S3にセンサー系のデータを出力している環境で可視化を行う機会があったため、Amazon AthenaとBIツールのRe:dashを使用して可視化を行うことにしました。

その際、Auto Refresh機能を使いデータをニアリアルタイム表示したかったのですが、手間取ってしまったので備忘録的に記載します。

Amazon S3のデータ

Amazon S3にはJSON形式で温度センサーのtimestamp(データ取得時間)とtemperature(温度データ)が保存されています。

{ "timestamp":"2018-03-19T15:32:26.353Z", "temperature":"23.215687"}

timestampはISO8601形式で状態で保存されているのですが、Amazon AthenaではISO8601形式が対応していない模様。

仕方なくtimestampをstring型でテーブルを作成し、WHERE句のlikeを使用して制御していたのですが、やはりRe:dashのAuto Refresh機能と連動させてデータをニアリアルタイム表示したい。。。

CREATE EXTERNAL TABLE IF NOT EXISTS temptb (
timestamp string,
temperature float
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://XXXXX/';

Amazon Athenaのクエリ

Amazon AthenaはPrestoが使われているとのことで、Prestoのマニュアルを調べました。

どうやら「from_iso8601_timestamp」といった、ISO8601形式の文字列をPrestoのdate型やdatetime型に置き換える機能が用意されている模様。

例えば、現在時刻~15分前のデータを表示するのであれば、Athenaのクエリは以下のように記述できます。

SELECT timestamp,temperature
FROM keyaki.tmptb
WHERE from_iso8601_timestamp(timestamp) > now() - interval '15' minute
order by timestamp

最初SELECT句で「from_iso8601_timestamp」を使用しましたが、その場合Re:dashのほうで時間が認識できなくなってしまうため、WHERE句での制御に使用するのがよさそうです。

まとめ

Re:dashのAuto Refresh機能を使ってAmazonS3のデータをニアリアルタイム表示することができました。

Amazon Athenaはデータが多いためかどうかわかりませんが応答がそれほど早くないため、Re:dashのAuto Refreshの間隔を長めにしたり、S3上のファイルの保存期間を調整したりするなどして改善する必要があるかもしれません。