QuickSightでSPICEの増分更新が出来るようになりました

2021.10.27

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

いわさです。

QuickSightでSPICEの増分更新が出来るようになりました。

SPICEは従来から更新スケジュールを設定して更新する(1時間ごとにデータセットをリフレッシュする)ことが出来ていたのですが、今まではその都度フルロードする必要がありました。
今回アップデートされた機能をうまく使うと、更新処理の短縮やデータストアの負荷軽減に繋がりそうです。

本機能を利用する場合、QuickSight Enterprise Editionが必要となります

RDS for MySQLを用意して試してみる

今回はRDS for MySQLで試してみます。
なお、増分更新が使えるデータストアはSQLベースのものが対象で、RedshiftやAthena、使ったことないのですがSnowflakeなども対象のようです。

パブリック接続にしました。

ちなみにQuickSightでパブリックデータストアへアクセスする場合は、QuickSightのIPアドレスからのアクセスを許可する必要があります。
東京リージョンの場合は13.113.244.32/27です。
詳細は以下を参考にしてください。

AWS リージョン 、ウェブサイト、IP アドレス範囲、エンドポイント - Amazon QuickSight

後述しますが、ダイレクトクエリの場合は増分更新機能は使えないです。
そもそも意味無い気もしますし。
SPICEモードを選択しましょう。

データセット更新時にタイプを選択出来るようになりました。
フル更新か増分更新です。

一旦RDSに以下のテーブルとデータを作成しフル更新しました。

iwasa.takahito@hoge 20211027quicksight % mysql -u admin -p -h quicksight.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.23 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database hoge;
Query OK, 1 row affected (0.03 sec)

mysql> use hoge;
Database changed

mysql> create table piyo (id int, name varchar(10), updatetime datetime DEFAULT NULL);
Query OK, 0 rows affected (0.05 sec)

mysql> show tables;
+----------------+
| Tables_in_hoge |
+----------------+
| piyo           |
+----------------+
1 row in set (0.03 sec)

mysql> insert into piyo values (1, 'aaa1', '2021-10-27 9:00:00');
Query OK, 1 row affected (0.02 sec)

mysql> insert into piyo values (2, 'bbb1', '2021-10-27 9:00:00');
Query OK, 1 row affected (0.02 sec)

mysql> insert into piyo values (3, 'ccc1', '2021-10-27 9:00:00');
Query OK, 1 row affected (0.02 sec)

テーブルで可視化しておきます。

増分更新してみる

ここからが本題の増分更新になります。
楽しみですね。試していきましょう。

mysql> update piyo set name = 'aaa2' where id = 1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update piyo set name = 'bbb2' where id = 2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update piyo set name = 'ccc2', updatetime = '2021-10-27' where id = 3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from piyo;
+------+------+---------------------+
| id   | name | updatetime          |
+------+------+---------------------+
|    1 | aaa2 | 2021-10-24 03:00:00 |
|    2 | bbb2 | 2021-10-24 03:00:00 |
|    3 | ccc2 | 2021-10-27 00:00:00 |
+------+------+---------------------+
3 rows in set (0.03 sec)

mysql>

初回、増分更新の設定が必要になります。
そして増分更新の設定時は完全更新の実行が必要となります。
初回だけはフルロードされる感じですね。

増分更新ですが、日付・タイムスタンプ列を対象にウィンドウサイズで時間枠を決めて、「タイムスタンプが○時間前までのもの」のみ取り込むような動きになります。
なので、対象のデータテーブルにはそもそもタイムスタンプや日付の列が必須です。
そして、○時間前の起点になる時間はSPICEの更新開始時間です。

updatetime列が1日前のものをロードするように設定してみました。

updatetime列は範囲外のものも含まれていますが、増分更新設定の初回なので3件とも更新されていますね。

データセットの設定画面を確認してみると、増分更新の設定が反映されています。

さて、もう一度データを更新した上で増分更新を試してみましょう。

mysql> select * from piyo;
+------+------+---------------------+
| id   | name | updatetime          |
+------+------+---------------------+
|    1 | aaa2 | 2021-10-24 03:00:00 |
|    2 | bbb2 | 2021-10-24 03:00:00 |
|    3 | ccc2 | 2021-10-27 00:00:00 |
+------+------+---------------------+
3 rows in set (0.03 sec)

mysql> update piyo set name = 'aaa3' where id = 1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update piyo set name = 'bbb3' where id = 2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update piyo set name = 'ccc3' where id = 3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from piyo;
+------+------+---------------------+
| id   | name | updatetime          |
+------+------+---------------------+
|    1 | aaa3 | 2021-10-24 03:00:00 |
|    2 | bbb3 | 2021-10-24 03:00:00 |
|    3 | ccc3 | 2021-10-27 00:00:00 |
+------+------+---------------------+
3 rows in set (0.03 sec)

mysql>

1件だけ取り込まれました!

分析のテーブルも確認してみます。

updatetimeが範囲内のものだけが更新されていますね。
他の2件はRDSへ反映した内容が無視されています。

新たに古いタイムスタンプのレコードを追加した場合

前述のように、差分を確認しているわけではなく日時フィールドを条件に取り込み範囲を従来より狭めている形です。

ですので、対象フィールドがルックバックウィンドウの範囲外であれば新規追加レコードでも取り込まれません。
古いタイムスタンプのレコードをInsert後に増分更新を行った場合は以下の結果となります。

すでに取り込み済みのNo3のレコードはルックバックウィンドウの範囲内なので取り込み済みだとしても再ロードされるので、1件カウントされています。

未来日は取り込まれる

試してみましたが、未来日は取り込まれました。
日時については「いつ以上」は条件にしているようですが、「いつまで」までは設定していないようです。

ルックバックウィンドウ

ドキュメント上明記されていなかったので、ウィンドウサイズに設定可能なサイズを確認してみました。

設定可能な最短

数値としては0が入力可能で、単位は時間が指定出来るので、「0時間前」が最短の時間となります。

設定可能な最長

100,000週までは確認しました。

100,000,000,000週は設定は可能ですが、SPICEロード時にエラーになりました。

100,000週で1,900年分使えれば十分だろうと思い、ほどほどで切り上げました。

設定できない数値

少数および負の数は設定出来ませんでした。
未来日だけ取り込むような使い方出来るかもと思ったのですが、残念です。

スケジュール

SPICEモード時のスケジュール設定も少し修正されています。

更新の種類でフル更新か増分更新か選択出来るようになりました。
フル更新の場合は繰り替えし頻度に、毎時・毎日・毎週・毎月を選択出来ていました。

増分更新の場合はその4つに加えて、15分ごと・30分ごと、が追加されました。
15分ごとに直近1時間のタイムスタンプデータを取り込む。みたいな使い方が出来るようになっています。

ダイレクトクエリモードは使えない

前述しましたが、SPICEモード時でのみ増分更新は利用出来ます。
ダイレクトクエリモードでは設定自体が存在していません。

まとめ

「毎回フルロードかぁ」と思っていた方も多いと思いますが、増分更新がとうとう出来るようになりましたね。
特に、大きなデータストアの場合だと本機能をうまく活用出来ると非常に効率化されるかもしれません。
現在のワークロードで効果的か是非確認してみてください。

増分更新時の設定タイムゾーンやクエリ挙動について少し気になる点があって調べていますので、別途記事に出来たらと思っています。