Amazon Timestreamのシングルメジャーとマルチメジャーについてまとめてみた
はじめに
Amazon Timestreamにはシングルメジャーレコードとマルチメジャーレコードがあります。
学習し始めの頃、レコードの種類が複数あることに困惑しました。
なんで複数あるんだろう?どちらを使えばいいんだろう?と迷ったので調べたことをまとめていきます。
Timestreamとは
Timestreamは、時系列データの保存と分析に適したマネージドデータベースサービスです。 時系列関数など、時系列データの処理に最適な機能を持っています。 IoTデバイスやアプリケーションのモニタリングデータなどで使用されることが多いデータベースサービスです。
用語
タイムスタンプ
タイムスタンプはデータが登録された時間を表します。 Timestreamではこのタイムスタンプを基準にデータが登録されます。
レコード
レコードは行のことです。 Timestreamを表形式で表した場合のレコードはこんな感じです。
ディメンション
ディメンションはデータを識別するための値です。 データをグループ化したり、フィルタリングする際に使用します。 イメージしにくいかと思うので、例えば以下のようなデータがあったとしましょう。
こちらのデータをフィルタリングするならどの項目でフィルタリングしますか? 時間により変化する測定値ではなく、変化の少ないデバイスの固有値(deviceid)や位置情報(location)でフィルタリングやグループ化を行うケースが多いでしょう。
このdeviceidやlocationがディメンションです。
また、すべてのディメンションは文字列型(varchars)として登録されます。 注意点として、一度登録されたディメンションは変更することが出来ません。
メジャー
メジャーは測定値です。 以下のデータではtemperature, level, pressureがメジャーです。
時間によって変化する数値などはメジャーとして登録することが多いです。
どの項目をディメンション or メジャーにするかはデータ登録時に設定します。 ここまでで前提知識の用語の説明はおしまいです。
シングルメジャーレコードとは
シングルメジャーレコードは名前の通り1レコードに1メジャーのみを登録できる形式です。 それでは実際のデータを見てみましょう。
こちらのデータはデバイスからtemperatureとlevelという測定値(メジャー)を取得しています。 タイムスタンプは同じですが、レコードが分かれていますね。
シングルメジャーレコードの特徴は
- ディメンションは複数登録可能
- メジャーは1つのみ登録可能
です。
間違いやすい点としては シングルメジャーレコードは複数の測定値を1レコードに登録できないのであって、 複数の測定値を同時に取得することは可能です、ただしレコードは分かれるよ。ということです。
マルチメジャーレコードとは
マルチメジャーレコードは1レコードに複数のメジャーを登録できる形式です。 実際のデータを見てみましょう。
こちらのデータはデバイスからtemperature, level, pressureという測定値(メジャー)を取得しています。 1つのレコードに複数の測定値が登録されていることがわかりますね。
マルチメジャーレコードの特徴は
- ディメンションは複数登録可能
- メジャーも複数登録可能
です。 マルチメジャーレコードは多くのケースで柔軟にデータを管理、登録できる形式です。
レコードの形式はいつ決まるのか?
レコードは最初に登録されたデータの形式に従います。 1つ目のデータがシングルメジャーレコードであれぼシングルメジャーレコードのテーブルになり、マルチメジャーレコードであればマルチメジャーレコードのテーブルになります。
最初にシングルメジャーレコードで登録したテーブルに対して、後からマルチメジャーレコードを登録するということはできません。
シングルメジャーとマルチメジャーの使い分け
それぞれの形式のユースケースを考えてみます。 いまいちシングルメジャーレコードの使い所が思いつかなかったのでAWSブログを参考にさせて頂きました。
シングルメジャーレコード
AWSのブログでは
シングルメジャー方式は、異なる期間で異なるメトリクスをキャプチャする場合、または異なる期間でメトリクスとイベントを発行するカスタム処理ロジックを使用する場合に適しています。
とあったので、おそらく以下のような形だと思います。 例えば1つのデバイスから次のような条件でデータ出力されたとしましょう。
- 温度センサーのデータを1分に1回出力する
- 湿度センサーのデータを1時間に1回出力する
この場合、データの種類(温度と湿度)も、データの登録時間も異なります。 マルチメジャーレコードで登録することも可能ですが、クエリを書く際に特定の時間間隔でデータをフィルタリングする必要があり、クエリが複雑になります。
上記のようなケースではシングルメジャーレコードを使うことで効率的なクエリが可能になるということだと思います。
マルチメジャーレコード
一定間隔で複数の測定値を出力するようなケースではマルチメジャーレコードを選択することが一般的です。 多くのユースケースではデバイスやアプリケーションは同時に複数の測定値を出力することが多いため、マルチメジャーレコードが適しているケースが多いです。 こちらのAWSドキュメントにもあるように、マルチメジャーレコードを使うことで、ストレージの節約や複数の測定値に対してのクエリ効率が向上します。
データを登録してみる
では実際にデータを登録してみましょう。
データの登録にはAWS SDKやAWS CLIが使えます。
ちょっと動きを確認してみたい、ということがあれば以下のコマンドを参考に使ってみてください。
今回はAWS CLIでデータを登録してみたいと思います。
シングルメジャーレコード
まずは以下のコマンドでシングルメジャーレコードを登録してみます。
aws timestream-write write-records \ --database-name demo-database \ --table-name single \ --records '[{ "Dimensions": [ {"Name": "deviceid", "Value": "abc123"}, {"Name": "location", "Value": "osaka"} ], "MeasureName": "temperature", "MeasureValue": "23.2", "MeasureValueType": "DOUBLE", "Time": "1718588400000", "TimeUnit": "MILLISECONDS" }]'
データが登録できたのでクエリを実行してデータを確認します。
SELECT * FROM "demo-database"."single" DESC LIMIT 10
<クエリ結果>
問題なくデータが登録されていますね。
マルチメジャーレコード
次にマルチメジャーレコードを登録します。 先ほどのテーブルはシングルメジャーでスキーマが定義されているので、マルチメジャーレコードを登録しようとするとエラーになります。 なので新しくテーブルを作成して以下のコマンドで登録します。
aws timestream-write write-records \ --database-name demo-database \ --table-name multi \ --records '[{ "Dimensions": [ {"Name": "deviceid", "Value": "abc123"}, {"Name": "location", "Value": "osaka"} ], "MeasureName": "metrics", "MeasureValues": [ { "Name": "temperature", "Value": "23.2", "Type": "DOUBLE" }, { "Name": "level", "Value": "1000", "Type": "BIGINT" }, { "Name": "pressure", "Value": "1013.1", "Type": "DOUBLE" } ], "MeasureValueType": "MULTI", "Time": "1718588400000", "TimeUnit": "MILLISECONDS" }]'
データが登録できたのでクエリを実行してデータを確認します。
SELECT * FROM "demo-database"."multi" DESC LIMIT 10
<クエリ結果> こちらも問題なくマルチメジャーで登録されていますね。
まとめ
なんとなくのイメージで多くの場合はマルチメジャーレコードが採用されるのだろう。と思って調べていましたがその通りでした。 マルチメジャーレコードは2021年のアップデートで新機能として追加されているので、おそらく1レコードに複数の測定データを登録したい!という要望が多かったんじゃないかな?と予想しています。