TableauServerで任意条件で変わる分析サイトを作ってみる

#はじめに
Tableauを使うと簡単にダッシュボードが作れるので、
その可視化力を活かして、簡易な分析サイトが作れないか試してみます。

今回は、Tableau Serverで任意の抽出条件を指定し、Amazon Redshfitから
データを取得して画面表示を行います。

※ セキュリティ等は考慮しません。

#作成の流れ

Tableau Desktopで作ったワークブックをサーバーにパブリッシュする流れで作成します。
また、Tableau Desktop（ローカル環境）から直接本番DBに接続出来ない想定で作成します。

（今回は下記の流れ）

- 一旦、TEXTファイル（sample.txt）のデータを用意する
※ ダッシュボード作成時は抽出データを使った方が早いので楽
※ TEXTファイルのヘッダーはテーブルのカラム名と合わせておく
※ 直接本番DBに接続出来るなら、この時点でカスタムSQLを作成して数件抽出した方が楽かも

- 上記TEXTを使用しTableau Desktopで画面イメージを作成する
- カスタムSQLを作成
- ワークブックのパブリッシュ
- 動作確認

＜注意＞
但し、カスタムSQLを作成する時点ではDBに接続する必要がありますので、
ローカル環境から接続可能な仮DB（DB名は本番DBと同じ名称）を用意する必要があります。
（データの中身はなくても良いけど、DB、テーブルの準備が必要です）

#サンプルデータ
**次の10,000件のデータがDB上に存在するものとする**

Table名：book

| id       |    author      |        title       |
|:---------|:---------------|:-------------------|
| 1     |    太宰治      |  人間失格          |
| 2     |    太宰治      |  走れメロス        |
| 3     |    太宰治      |  斜陽              |
| 4     |    ○○○○    |  ××××          |
| 5     |    ○○○○    |  ××××          |
| ・・・     |    ・・・    |  ・・・          |
| 9998  |    宮沢賢治    | 銀河鉄道の夜       |
| 9999  |    宮沢賢治    | セロ弾きのゴーシュ|
| 10000  |    宮沢賢治    | 注文の多い料理店   |

#TableauDesktopでワークシートを作成する

まず、TEXTファイルを読み込んでワークシートを作成する。
ここでは、データ表示を行う「表」と共にSQLの「条件」となるパラメーターを作成する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/270976/19f3f1f7-8cca-0e41-4742-e91b081b3386.png)

#ダッシュボードに配置する

ダッシュボードに先ほど作ったワークシートを配置し、条件入力欄となるパラメーター（作者）を表示する。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/270976/2552ad70-337f-ad48-dcf9-4e307940dc0d.png)
#カスタムSQLの作成

＜新規接続の追加＞
![3_.png](https://qiita-image-store.s3.amazonaws.com/0/270976/5a6088b7-e7c8-51d6-4819-9f7b678385ff.png)

今回は仮DBとしてPostgreSQL（Amazon RedshiftはPostgreSQLに基づいているため）の環境を用意する。
但し、厳密には相違点があるため注意が必要。
接続は作れてもカスタムクエリ作成時の結果プレビューはエラーが出る可能性あり。
[Amazon Redshift および PostgreSQL](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_redshift-and-postgres-sql.html)

＜カスタムSQLの作成＞
![4.png](https://qiita-image-store.s3.amazonaws.com/0/270976/bdaeae4f-737e-8e73-ad61-e85a2cfe3d0c.png)

- 接続は動的に内容を変えるため、「**ライブ**」接続にしておく
![10.png](https://qiita-image-store.s3.amazonaws.com/0/270976/4b0dcdfe-87e4-53be-4ae8-7bd2537b5f12.png)

#ワークブックのパブリッシュ

Tableau Serverにワークブックをパブリッシュします。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/270976/7cc11c44-a79d-a97a-fdbf-d25f324ec19a.png)
今回は仮DBに接続していたので、パブリッシュ後にTableauServer上で本番DBに接続先を変更する。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/270976/17214fd5-905b-5c90-8e09-fb021a50f5fb.png)
**（注意）上述した通り、このタイミングで接続DB名は変更出来ないので注意**

#動作確認

検索条件を変えて、データが絞り込まれるか確認してみる。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/270976/23a939b6-1804-ef94-464e-4baa7315fa05.png)
AWS管理画面からSQLを見ると下記のようなクエリが流れているのが確認出来ます。
無事、条件（作者名）変更したデータを都度取得しています。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/270976/9c5cb986-5841-6e7a-3410-325db6e15103.png)
TableauからRedshiftに投げるクエリはカーソルが利用されるようです。
Redshiftのカーソルクエリはキャッシュに乗るようなので、同クエリであれば
2回目以降の表示は早くなりそうですね。

実際に流れているクエリを確認するには下記の投稿が参考になります。
[TableauでRedshiftに実行されたクエリを確認する](https://qiita.com/wapa5pow/items/c53e1f482e51eac7de1e)

#おわりに

確かに可視化という部分では手軽に作ることが出来ましたが、
入力したパラメーターに応じてSQLの条件を変えたりすることが難しい(※1)ので、
基本的に1本のSQLで抽出したデータを使った分析サイトなら出来そうです。
(※1) パラメーターを使って対象テーブルの切り替えを行う等は出来そう
**もし計算フィールドがカスタムSQLに挿入出来るようになれば幅が広がりそうですね。**

＜下記のような動的な分析サイトが作成可能です＞
![9.png](https://qiita-image-store.s3.amazonaws.com/0/270976/5e0032e5-554b-f70c-7e53-b85eaa638882.png)
＜その他＞
1．初回アクセス時のパラメーターに条件を入れていないときは、
DBにアクセスしてほしくないのですが、これを止める方法はないかなぁ。。

2．大規模なデータの場合、パフォーマンスに心配があります。
DBサーバーのスペックをあげたり、目的に応じたデータマートを作ったりすれば
早くなりますかね。