【アップデート】Timestreamで複数テーブルのJOINや高度な時系列関数が利用可能になりました

2021.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部@大阪の岩田です。少し時間が空いてしまいましたが、先日のアップデートによりTimestreamで複数テーブルのJOINや高度な時系列関数が利用可能になりました。今回のアップデートについて改めて紹介させて頂きます。

アップデート内容

上記AWSブログで紹介されているように、Timestreamのクエリエンジンにいくつかアップデートが入っています。1つずつ順を追って見ていきましょう。

複数テーブルのJOINやUNIONに対応

従来Timestreamのクエリでサポートされていた結合処理は自己結合(SELF JOIN)のみでした。今回のアップデートによりテーブルAとテーブルBを結合するようなクエリが実行可能になりました。同様にUNIONについても複数テーブルに対するクエリをUNION可能になりました。

TimestreamのサンプルDBを利用して複数テーブルのJOINとUNIONを試してみましょう。

まずはJOINから。全然無関係なテーブルがCROSS JOINされるメチャクチャなクエリですが、以下のクエリを実行してみました。

SELECT
	A.fleet,
    A.truck_id,
    B.hostname,
    B.az,
    B.region
FROM
	(SELECT * FROM "sample-db"."IoT" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5) A
	LEFT OUTER JOIN		
	(SELECT * FROM "sample-db"."DevOps" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5)  B
    ON 1 = 1

実行結果です。

fleet truck_id hostname az region
Alpha 2759574409 host-Sr3H2 us-west-1c us-west-1
Alpha 2759574409 host-pZmEP us-west-2b us-west-2
Alpha 2759574409 host-penQN us-east-1a us-east-1
Alpha 2759574409 host-5uCmL eu-north-1b eu-north-1
Alpha 2759574409 host-9uNS5 eu-central-1b eu-central-1
Alpha 683993576 host-Sr3H2 us-west-1c us-west-1
Alpha 683993576 host-pZmEP us-west-2b us-west-2
Alpha 683993576 host-penQN us-east-1a us-east-1
Alpha 683993576 host-5uCmL eu-north-1b eu-north-1
Alpha 683993576 host-9uNS5 eu-central-1b eu-central-1
Alpha 9355060257 host-Sr3H2 us-west-1c us-west-1
Alpha 9355060257 host-pZmEP us-west-2b us-west-2
Alpha 9355060257 host-penQN us-east-1a us-east-1
Alpha 9355060257 host-5uCmL eu-north-1b eu-north-1
Alpha 9355060257 host-9uNS5 eu-central-1b eu-central-1
Alpha 7219245711 host-Sr3H2 us-west-1c us-west-1
Alpha 7219245711 host-pZmEP us-west-2b us-west-2
Alpha 7219245711 host-penQN us-east-1a us-east-1
Alpha 7219245711 host-5uCmL eu-north-1b eu-north-1
Alpha 7219245711 host-9uNS5 eu-central-1b eu-central-1
Alpha 923079148 host-Sr3H2 us-west-1c us-west-1
Alpha 923079148 host-pZmEP us-west-2b us-west-2
Alpha 923079148 host-penQN us-east-1a us-east-1
Alpha 923079148 host-5uCmL eu-north-1b eu-north-1
Alpha 923079148 host-9uNS5 eu-central-1b eu-central-1

IoTのサンプルデータとDevOpsのサンプルテーブル2つのテーブルがJOINできていることが分かります。

続いてUNIONも試してみます。

SELECT
	time,
    measure_name
FROM
	(SELECT time,measure_name FROM "sample-db"."IoT" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5)
		UNION
	(SELECT time,measure_name FROM "sample-db"."DevOps" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 5)

実行結果です。

time measure_name
2021-02-13 05:38:14.756000000 speed
2021-02-13 05:37:20.008000000 load
2021-02-13 05:38:37.143000000 load
2021-02-13 05:38:46.975000000 speed
2021-02-13 05:38:22.730000000 memory_utilization
2021-02-13 05:38:17.068000000 cpu_utilization
2021-02-13 05:38:24.517000000 cpu_utilization
2021-02-13 05:38:12.745000000 cpu_utilization
2021-02-13 05:38:25.691000000 cpu_utilization
2021-02-13 05:38:55.976000000 location

IoTのサンプルデータとDevOpsのサンプルテーブル2つのテーブルからSELECTした結果がUNIONできていますね。

クエリでスキャンされたデータ量が確認可能に

Timestreamのクエリはスキャンされたデータ量に対して課金されます。これまではクエリ実行毎にスキャンされたデータ量を知ることができず、クエリの料金を正確に見積もることが困難でした。今回のアップデートによりスキャンされたデータ量が簡単に確認できるようになりました。

これで月額利用費の見積もりなど大分やりやすくなったのではないでしょうか?

よくよく調べるとAPI自体は2020/11/23時点で更新されていたので、これまでアナウンスされていなかっただけで、実は結構前から確認可能になっていたのかもしれません。

https://awsapichanges.info/archive/changes/d2b896-query.timestream.html

昨年末にDynamoDBとTimestreamの比較記事を書いた時点ではスキャンされたデータ量は確認できなかったような記憶があるのですが...正確なところはちょっと自信が無いです。

高度な時系列関数の追加

Timestreamの特徴でもある時系列関数ですが、新たに利用可能な関数が増えました。手元に残っていたメモと比較する限り、今回のアップデートによって追加された時系列関数は以下のようです。

※具体的にどの関数が追加されたという公式のソースが見つからず、最新ドキュメントと私の手元のメモとの比較になります。もし間違いなどあればご指摘下さいm(_ _)m

Time series functions

Function Output data type Description
correlate_spearman(timeseries, timeseries) double Calculates Spearman's correlation coefficient for the two timeseries.
The timeseries must have the same timestamps.
filter(timeseries(T), function(T, Boolean)) timeseries(T) Constructs a time series from an the input time series, using values for which the passed function returns true.
reduce(timeseries(T), initialState S, inputFunction(S, T, S), outputFunction(S, R)) R Returns a single value, reduced from the time series.
The inputFunction will be invoked on each element in timeseries in order.
In addition to taking the current element, inputFunction takes the current state (initially initialStats) and returns the new state.
The outputFunction will be invoked to turn the final state into the result value.
The outputFunction can be an identity function.

correlate_spearmanはいわゆるスピアマンの順位相関係数ですね。filterreduceに関しては多くのプログラミング言語で同等の機能が実装されているので、普段からプログラムを書いている人であればスムーズに理解が進むと思います。

JDBCドライバーのソースコードがGitHubで公開

Timestream本体の機能拡張では無いですがTimestream向けのJDBCドライバがGitHub上で公開されました。ライセンス形体はApache 2.0ライセンスとなっており、Timestreamを利用するディベロッパーが機能追加や機能拡張に貢献できるようになりました。

https://github.com/awslabs/amazon-timestream-driver-jdbc

まとめ

TimestreamがGAされて以後はじめてのアップデートですね。今後も色々な機能が拡張されていくことに期待したいです。