QuickSightのSPICEのフル更新と増分更新の検証

# 概要

AWSのBIツールであるQuickSightでは、データはキャッシュされ、SPICEに保持されます。
SPICEの更新方式にはフル更新と増分更新がありますが、使用が分かりにくいためデータとともに検証し整理したいと思います。


公式ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/refreshing-imported-data.html)を参照ください。


# 検証環境

## データのフロー

データフローは以下の流れで実施します。

① S3にファイルを格納
② Athena経由でSPICEに取り込み
③ 結果をQuickSightのダッシュボードで確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/88ca1df1-3aa9-4bd0-adce-8016590d3a1c.png)


## QuickSightのダッシュボードの設定

ダッシュボードの設定内容は以下の通りです。結果の1つとしてダッシュボードの内容を確認していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/33e94097-d55b-4650-85fa-4a116d34dc0e.png)


# SPICE取り込み検証

# 【フル更新検証】



## フル更新①

空のスパイスにフル更新でデータを取り込みます。

- **取り込み内容**

```:csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **SPICE更新内容**

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|3|3|フル更新|

- **ダッシュボードで表示**

想定通り3件のデータを登録できました。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|300|

## フル更新②（同一データあり）

次に、同じデータがあった場合にどうなるかの検証です。


- **取り込み内容**

idが3のデータが2件になるようにCSVを用意しました。

```csv:csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **SPICE更新内容**

しっかりと、4件取り込まれました。

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|4|4|フル更新|

- **ダッシュボードで表示**

ダッシュボードに表示された結果は3件ですが、同じレコードは加算されるようにグラフを作成したので、Cのpointが600になっています。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|<font color="Red">600</font>|


# 【増分更新検証】

増分更新には、設定オプションがあり、本日日付からの期間の範囲を指定します。
期間の範囲内と範囲外ではそれぞれどのような挙動をするのかを整理していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/6321e371-c4c4-4b84-b28f-f63dccf10458.png)

## 増分更新 追加（期間範囲内） 

- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

取り込みデータには、Dのデータを追加しました。

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
4,D,400,2025-03-14 01:00:00.000
```

- **SPICE更新内容**

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|4|4|増分更新|

- **ダッシュボードで表示（ビジュアル：テーブル）**

Dのデータが追加されました。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|300|
|<font color="Red">4</font>|<font color="Red">D</font>|<font color="Red">400</font>|

##  増分更新 更新（期間範囲内） 

- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

Aのpointを100から500に変更しました。

```csv
id,name,point,datetime
1,A,500,2025-03-14 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```
- **SPICE更新内容**

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|3|3|増分更新|

- **ダッシュボードで表示**

Aのデータが更新されました。

|id|name|point|
|--|--|--|
|1|A|<font color="Red">500</font>|
|2|B|200|
|3|C|300|

## 増分更新 削除（期間範囲内） 

- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

Bのデータを削除しました。

```csv
id,name,point,datetime
1,A,100,2025-03-15 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **SPICE更新内容**

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|2|2|増分更新|

- **ダッシュボードで表示**

Bのデータが削除されました。
ということは、取り込むデータだけでなく、元のデータの日付も参照しているようですね。

|id|name|point|
|--|--|--|
|1|A|100|
|3|C|300|



## 増分更新 追加（期間範囲外）


- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

Dのデータを追加しました。

```csv
id,name,point,datetime
1,A,500,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
4,D,400,2025-03-14 01:00:00.000
```

- **SPICE更新内容**

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|0|3|増分更新|

- **ダッシュボードで表示**

ダッシュボードに変化はありませんでした。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|300|


## 増分更新 更新（期間範囲外）


- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

Aのpointを100から500に変更しました。

```csv
id,name,point,datetime
1,A,500,2025-03-14 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,250,2025-03-13 01:00:00.000
```

- **SPICE更新内容**


|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|0|3|増分更新|

- **ダッシュボードで表示**

ダッシュボードに変化はありませんでした。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|300|


## 増分更新 削除（期間範囲外）

- **SPICE取り込み済みのデータ**

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
2,B,200,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **取り込み内容**

Bのデータを削除しました。

```csv
id,name,point,datetime
1,A,100,2025-03-13 01:00:00.000
3,C,300,2025-03-13 01:00:00.000
```

- **SPICE更新内容**

Bのデータを削除しました。

|取り込まれた行|データセットの行|更新の種類|
|-|-|-|
|0|3|増分更新|

- **ダッシュボードで表示**

ダッシュボードに変化はありませんでした。

|id|name|point|
|--|--|--|
|1|A|100|
|2|B|200|
|3|C|300|


# そのほか

「**データセットの設定**」や「**増分更新の設定**」を変更した場合に、SPICEの更新設定が実行されてしまいます。その実行内容はフル更新で実行されているようです。


# まとめ

- **フル更新**: SPICE上のデータを空にして新しくデータを取り込む
- **増分更新（期間範囲内）**: 取り込むデータだけでなく、元のデータの日付も参照し取り込む
- **増分更新（期間範囲外）**: データの取り込みはされない

図で表すと下記のようなイメージになります。（図は、増分更新になっているが、フル更新は更新期間がすべてになるイメージ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/4946ba4d-246c-46d4-b59e-3ee45aa51eae.png)

日付を指定して増分更新の機能はなさそうなので、更新漏れがないように増分更新のスケジューリングが必要ですね。また、問題があって、増分更新の期間を変えたい場合にフル更新が実行されてしまうのでそちらも注意が必要ですね。

# 終わりに

今回は、QuickSightのスパイス取り込みの使用についてまとめました。
機会があれば、データ件数が多い場合などの処理時間や、そのコストを削減できる方法を整理する方法を調査できればと思います

以上、ここまで読んで頂きありがとうございました。