Tableau Prep Builderのパフォーマンス向上Tips

##はじめに

Tableau Prep Builderを使っていると、フローの構築が重かったり出力ファイルの作成に時間がかかったりすることがあります。そんな時に確認することで、パフォーマンス向上が期待できる項目をまとめました。

##大原則

**大原則①　処理データが少ないほどPrepのパフォーマンスは上がる。**
まず大原則として扱うデータのデータ量が少なければ少ないほどPrepのパフォーマンスはあがります。後述するベストプラクティスも、データ量をいかに少なくするか・それをいつ設定するかに関わってくるのでこれは非常に重要なポイントです。

**大原則②　Prep Builderの性能は使っているPCスペックに依存する。**
Prep Builderはインストールしているマシンの性能（特にメモリ）に大きく依存します。実際、公式ドキュメントでも高パフォーマンスの要件としては32GB以上のメモリスペックが推奨されています。
https://www.tableau.com/ja-jp/products/techspecs


ベストプラクティスに沿っているはずだけども作業にならないほど読み込みが遅い、などの場合には高スペックマシンを使ってみる（仮想環境でも可）か、Tableau OnlineまたはTablaeu Server上でのPrepのWeb編集がおすすめです。一部の制約を除いてTableau Prep Builderの機能はほとんどWeb編集でも使えます。


https://help.tableau.com/current/prep/ja-jp/prep_web_auth.htm

##ベストプラクティス

###データ量を減らす（列方向）

列方向にデータを減らす場合は、シンプルに加工対象とする列を削除すればOKです。一番のベストプラクティスは、Tableau Prepの以下図のように、不要な列は入力ステップの段階で列のチェックボックスを外しておくことです。最初のステップでhyperファイルが作られそのキャッシュにクエリする形で後続のフローが実行されるので、最初のhyperファイルが小さければ小さいほど後続のパフォーマンスは上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/1446ea0b-b50d-79e5-1674-51114123a893.png)

できれば入力ステップで削除するのがベストですが、それが難しい場合であってもとにかく早いステップで不要な列を削除しましょう。後続のステップよりも前半のステップでデータを絞ることが大切です。特に文字型（String）のデータは数値（Integer）よりパフォーマンスが悪いので、分析に不要なら文字型の列は優先的に除外するのが良いです。

![prep3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/f36ca426-0922-3d26-d77f-b590f27ed930.png)

※画像は以下より引用
https://www.tableau.com/ja-jp/about/blog/2018/11/three-tips-in-flow-design-to-use-tableau-prep-easily-98758

###データ量を減らす（行方向）
早い段階でデータ量を減らすのがベストプラクティスであることは行方向のフィルターにおいても同じです。できれば上記と同じく入力ステップでフィルターをかけるのが良いです。入力ステップで行方向にフィルターをかける場合には結果が真偽値となる計算式を書くことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/787a1149-c1ba-f449-b553-c99c12a1b5c2.png)

Prepにまだ慣れておらず入力ステップで計算式を書きにくい場合は、クリーニングステップで必要な項目のみを「保持」するのが簡単です。しつこいですが、フローの中でなるべく早い段階でフィルターして絞りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/55b5cb14-3c90-96ce-6665-42b474154772.png)



###集計を使いデータの粒度を粗くする
Tableau Prepでは集計機能を使えばデータの粒度を粗くすることができます。例えば、日単位のデータを持つよりも月単位や年単位にまとめたほうが粒度が荒くなるため、行数もぐっと減ります。最初はどの粒度まで集計すれば良いか分からない時には、一度細かい粒度のままで出力してみて、それをTableau Desktopで分析し、分析に必要な粒度を確認してからPrepに戻って集計を加えるのがオススメです。

以下のフローは、例えば日単位で入っているデータを年単位と販売地域単位に丸め、利益や売上や数量といった数値項目を集計しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/073b4157-de9d-895c-8d9d-bb32f3f6619c.png)


###結合ステップでは結合だけする

結合はTableau Prepの処理の中でもっとも処理負荷がかかるステップです。結合ステップの中で、さらにデータ型を変換したり、名寄せしたりなどなど様々な処理を加えることもできるのですが、ベストプラクティスは結合ステップでは結合だけする。です。データ型の変換や名寄せなどは前後のクリーニングステップで行うと良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/35c0c01e-d703-7022-08c7-4240dac8b207.png)

余談ですが、クロスデータベース結合（異なる種類のDBからテーブルを持ってきて結合する場合）になるとネットワーク負荷も関連するのでさらに負荷は増します。もし作業にならないほど遅いのであればPrepではなく、DB側でテーブル結合だけ行ってしまうというのも手です。

###出力ファイルはhyperにする

Prep Builderの出力方法は複数ありますが、その中でローカルフォルダにファイルとして出力する場合はCSV、エクセル、hyperファイルが選択できます。その中でやはりTableauに最適化されているとうことでhyperファイルの出力が最速だというテスト結果があります。（巨大データの出力時に、CSVだと3時間近くかかったのがhyperだと11分で完了した）出力データの使い道がTableau以外なのでCSV出力したいという場合は仕方ありませんが、Talbeau DesktopないしはTalbeau Online/Server上での分析が目的なのであれば、hyper出力一択です。


###サンプリングを味方につける

Tableau Prepでは、フロー構築時のパフォーマンスが良くなるよう最善を尽くす仕様になっており、大きなデータを扱う際に自動的にサンプリングが行われます。デフォルトではこのサンプリングはクイック選択となり、クイック選択の場合は必ずしもデータ加工の対象となるデータ項目が含まれない可能性があります。（※列は全て取り込まれます。）

つまり、クリーニングステップにて以下のように、「9986行と表示されているけど、ほんとは元データ1000万行のはずなのだが？」、「出荷モードの列には10項目くらい入っているはずだが4つの項目しか表示されていない」ということが起こりえます。なお、この場合でも出力ステップを実行した場合には全行処理されますのでご安心ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/750d153a-529e-826d-4b2d-24bd5a9d1ea2.png)

フローの設計が明確に決まっている場合にはこのサンプリングかつクイック選択でも良いのですが、データの全量を見てフローを設計したいということもあると思います。その場合は入力ステップにて、サンプリング方法を「ランダムなサンプル」にします。こうすれば極力全ての項目をランダムにサンプリングするようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884972/427f6127-c9b4-4086-d18e-4c2bbd6c7602.png)

それでも加工対象となる項目が出てこない場合は、サンプリングではなく「すべてのデータを使用」を選択します。その場合はPrepのパフォーマンスとトレードオフになる可能性があります。

逆に、規定のサンプル量（サンプリング）とクイック選択の組み合わせで出る結果よりまださらに少ないデータ量でフローを設計したい、ということであれば、「固定の行数」に任意の行数を入れればもっとパフォーマンス良く作業ができます。


##そのほかのTips

- ネットワーク共有フォルダにあるExcel, CSVファイルを入力としている時

DBの接続方法とExcel, CSVのようなフラットファイルの接続方法は裏では異なるため、ネットワーク共有フォルダに保存されている場合はデータ取得のためにネットワークを介さねばならず、レイテンシの影響を受けてしまう。可能であればPrep Builderがインストールされているマシンと同じローカルフォルダにファイルがあると作業がスムーズ。

- Custom SQLを使っている場合

最終的に同じ結果になるCustom SQLとPrepフローがある場合、フローの実行が早くなるのはPrepフローで組んだ場合です。なぜならPrep内のフローは最も早い処理結果となるようクエリを最適化させているからです。どーーうしてもSQLを書かないと必要な処理がPrepで出来ない非常にレアなケースを除いて、Custom SQLは使わずにPrepフローを組むのがオススメです。


##参考記事

https://www.tableau.com/ja-jp/about/blog/2018/11/three-tips-in-flow-design-to-use-tableau-prep-easily-98758

https://kb.tableau.com/articles/howto/How-To-Improve-Tableau-Prep-Builder-Performance?lang=ja-jp

https://tc19.tableau.com/learn/sessions/best-practices-flow-performance-data-prep

https://www.tableau.com/ja-jp/learn/whitepapers/data-prep-best-practices