Tableau Tips: 「大容量の抽出ファイル作成&パブリッシュ」の手間を「空の抽出ファイル作成」で効率化する #tableau

2017.10.02

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

先日Tableau関連のSNSで以下のトピックが挙がっており、目を通してみたところ非常に有用なテクニックが紹介されていました。「大容量の抽出ファイルを作成しパブリッシュする時の手間や問題を省くために"空の抽出ファイルを作成"して対応する」というものです。内容的にも一手間加えるだけで実現出来て非常に便利なものでしたので、当エントリでもその内容を実際に試してみたいと思います。

Tableauにおける「抽出ファイル作成&パブリッシュ」の流れと問題点

Tableauでは、データをライブな(リアルタイムの)接続方式では無く、ある一定タイミングに於けるスナップショットの形で、ローカル環境にデータをコンパクトにまとめた、圧縮した形で保存しておける手段があります。これは「抽出」と呼ばれるもので、リアルタイム性は無くなりますがデータを非常に素早く効率的に扱う事が出来るようになります。また、この抽出ファイルはTableau Server上にデータソースとしてパブリッシュする事が出来、Tableau Serverのスケジュールで「抽出の更新」を定期的に行わせる事でTableau Server上にあるデータソースを有効に活用出来るようになる(対象データソースに対する負荷を分散出来るようになる)というメリットもあります。

tde-extract-ok

...という便利な機能ではあるのですが、この抽出ファイルを作成する上で「件数が多い、容量が多い」データソースを対象にするとなると最初の準備がちょっと手間が掛かるようになってしまいます。一般的な手順としてはまず「対象全件」を抽出対象としてデータを持ってきた上でそれらを抽出ファイルとして作成...という流れとなるので、ここでデータ量が膨大となってしまうとデータを引っ張ってくるだけでも時間が掛かります。また、ストレージ容量が数GB〜数十GB規模ともなると、ローカル環境のストレージ容量を圧迫する事態も十分予想されます。

tde-extract-hard

この作業は「最初の1回やってしまえば」あとはTableau Server上で管理出来るようになるのですが、その「最初の1回」で苦労しがちな部分でもあります。今回ご紹介する内容はその苦労しがちな部分を「ひと工夫」を加える事で効率化しよう、というものになります。

「空のTDEファイル作成&パブリッシュ」実践

当内容を検証するにあたり、Amazon Redshiftに以下のような形で大きめのデータを用意しました。件数は5000万件、データサイズは2.7GB程です。

# \d public.lineorder;
                Table "public.lineorder"
       Column       |         Type          | Modifiers 
--------------------+-----------------------+-----------
 lo_orderkey        | integer               | not null
 lo_linenumber      | integer               | not null
 lo_custkey         | integer               | not null
 lo_partkey         | integer               | not null
 lo_suppkey         | integer               | not null
 lo_orderdate       | integer               | not null
 lo_orderpriority   | character varying(15) | not null
 lo_shippriority    | character varying(1)  | not null
 lo_quantity        | integer               | not null
 lo_extendedprice   | integer               | not null
 lo_ordertotalprice | integer               | not null
 lo_discount        | integer               | not null
 lo_revenue         | integer               | not null
 lo_supplycost      | integer               | not null
 lo_tax             | integer               | not null
 lo_commitdate      | integer               | not null
 lo_shipmode        | character varying(10) | not null

# SELECT COUNT(*) FROM public.lineorder;
  count   
----------
 50000000
(1 row)

# select
  trim(pgn.nspname) as Schema,
  trim(a.name) as Table,
  (CAST(b.mbytes as double precision) / 1024) as gbytes,
  a.rows,
  to_char(a.rows, '9999,9999,9999,9999') as rows_jp
from (
       select db_id, id, name, sum(rows) as rows
       from stv_tbl_perm a
       group by db_id, id, name
     ) as a
  join pg_class as pgc on pgc.oid = a.id
  join pg_namespace as pgn on pgn.oid = pgc.relnamespace
  join pg_database as pgdb on pgdb.oid = a.db_id
  join (
         select tbl, count(*) as mbytes
         from stv_blocklist
         group by tbl
       ) b on a.id = b.tbl
where trim(pgn.nspname) = 'public' and trim(a.name) = 'lineorder'
order by mbytes desc, a.db_id, a.name;
 
 schema |   table   |  gbytes   |   rows   |       rows_jp        
--------+-----------+-----------+----------+----------------------
 public | lineorder | 2.7734375 | 50000000 |            5000,0000

Amazon Redshiftに対し、Tableau Desktopから直にアクセスして件数を確認してみます。

tableau-empty-extract_01

そしてここから実践開始。まず始めに「パラメータの作成」を実施。

tableau-empty-extract_02

以下の形で、真偽値を取るパラメータを新規作成します。

tableau-empty-extract_03

続いて計算フィールドを作成。

tableau-empty-extract_04

上記パラメータ値をそのまま参照させるような形でこちらも計算フィールドを新規作成します。

tableau-empty-extract_05

そしてデータの抽出を実施。

tableau-empty-extract_06

この時、上記手順で作ったフィールドを活用します。先ほど作った計算フィールドをフィルターとして追加。

tableau-empty-extract_07

フィルターの条件として「真(true)を除外」という形で設定します。

tableau-empty-extract_08

[抽出]を押下。

tableau-empty-extract_09

任意の名前を付けて抽出ファイル作成を実行。すると通常の作成であればそれなりの時間が掛かる抽出ファイル作成の処理が一瞬で終わります。上記フィルタの追加での設定を行った事で、本来作成されるべき処理の部分がスキップされた形となりました。

tableau-empty-extract_10 tableau-empty-extract_11

作成されたファイルを確認してみます。データ自体が含まれない、ほぼガラだけのサイズ感となっている事が確認出来ました。

tableau-empty-extract_12

空のtdeファイルをTableau Serverにパブリッシュします。ここで大切なのは先ほど作成したパラメータの設定を、パブリッシュ前に切り替えておくことです。「パラメータコントロールの表示」を行い、

tableau-empty-extract_13

設定値を「偽(false)」となる値(ここでは"No")を選択切り替えしておきます。先程の条件と逆の値を設定しておく事で今度はちゃんと抽出作業が行われる流れになる、という事ですね。

tableau-empty-extract_14

Tableau Serverに空のTDEファイルをパブリッシュします。

tableau-empty-extract_15

接続先をAmazon Redshiftへのライブ接続から、パブリッシュしたTDEファイルに切り替えてみます。Tableau Desktopを起動し直して接続先設定をTableau Serverに向け、

tableau-empty-extract_16

先程と同じように件数表示をさせてみました。TDEファイルは空なので当然ながら件数も0件です。

tableau-empty-extract_17

上記パブリッシュしたTDEファイルはタスクとしてTableau Serverのスケジュールで実行されるように設定していますが、ここではそのスケジュール実行を待たずに一回手動実行させてみたいと思います。作成した「抽出の更新」を"今すぐ実行"。

tableau-empty-extract_18

しばらくして処理が完了しました。

tableau-empty-extract_19

処理完了後先程のTableau Desktop接続をリロードしてみます。抽出内容が反映されている事をDesktop上でも確認出来ました。

tableau-empty-extract_20

まとめ

という訳で、「空のTDEファイルを作成してパブリッシュ」という、日々の運用作業で役立ちそうなワザのご紹介でした。扱うデータ量が大きくなればなる程効いてくるテクニックだと思いますので、是非有効活用していきたいところですね。