この記事は『CRESCO Advent Calendar 2022』14日目の記事です。

 

こんにちは、データテクノロジーセンターのn-satoです。

Tableauの抽出っていろいろ設定できるんだけどどんな動作するのかわかっていない…
ということで抽出の設定をアレコレ確認した記事を書きたいと思います。

目次

実行環境

OS:Windows10
Tableau Desktop:2022.3.0

抽出を作成する

おさらいの意味も含め、抽出の作成方法も確認します。

「サンプル – スーパーストア.xls」の「注文」シートで抽出を作成します。
データソース画面にて接続を抽出にします

データソース画面の「抽出」の右にある「編集」を押下すると、抽出の設定に関するダイアログが表示されます。
抽出時にある条件でフィルターしたり、サンプリングしてデータ量を少なくしたりをここで行うことができます。

データソース画面左下の「シート1」をクリックすると抽出の保存を求められます。
ローカル環境上に.hyperという形式で抽出が作成されます。

データソース画面以外からでも上部メニューにある「データ」から抽出を作成できます。

データソース画面の「編集」を押下すると表示される内容と同じダイアログが表示されます。
「抽出」を押下し、保存先を指定すると、ローカル環境上に.hyperという形式で抽出が作成されます。

「データの抽出」設定の各設定の動作を確認する

4つの設定項目があります。それぞれどんな動作をするのかを実際に確認していきます。

  • データストレージ(論理テーブル、物理テーブル)
  • フィルター
  • 集計
  • 行数

データストレージ(論理テーブル、物理テーブル)

論理テーブル、物理テーブルのデータモデルの考え方はTableau 2020.2で追加されました。
(結構最近なイメージでしたが2020.2からだったんですね…)
データの結合(リレーション)を論理レイヤー、物理レイヤーどちらで行うか選択できるようになり、
論理レイヤーに存在するテーブルを論理テーブル、物理レイヤーに存在するテーブルを物理テーブルと呼びます。

論理テーブル、物理テーブルのイメージは、論理テーブル配下に物理テーブルが定義されているイメージです。

これらのTableauにおけるデータモデルの詳細はこちらを確認ください。
https://help.tableau.com/current/server/ja-jp/datasource_datamodel.htm

抽出における論理テーブル、物理テーブルは、どのレイヤーで定義されたテーブルを抽出するかという設定になります。

準備

先ほどのイメージの内容を再現し、実際に論理テーブル、物理テーブルで抽出を行った時の結果を確認します。
まずは準備としてこの構造となるデータソースをTableau上に作成します。

「サンプル – スーパーストア.xls」を用いて以下のようにデータソースを作成しました。

    • 論理レイヤー
    • 注文の物理レイヤー
    • 返品の物理レイヤー

動作結果確認

  • 論理テーブルの設定で抽出した場合

データストレージを論理テーブルに設定して抽出ファイルを作成します。

作成された.hyperファイル(抽出ファイル)を確認すると、論理レイヤーで定義した2つの論理テーブルとして抽出されていることが確認できます。
「注文_…」の中身を確認してみると、フィールドの項目にある物理テーブル列に「注文」と「関係者」があることから結合した状態のデータであることが確認できます。

  • 物理テーブルの設定で抽出した場合

データストレージを物理テーブルに設定して抽出ファイルを作成します。

物理テーブル単位で抽出されます。論理テーブルの情報は保持されません。

フィルター

条件に当てはまるデータのみ抽出することでデータ量を制限します。
通常のフィルターを同じように設定できます。

準備

「サンプル – スーパーストア.xls」を使って動作を確認します。
オーダー日を2021,2022年でフィルターを設定し、結果を確認してみましょう。
フィルター欄の「追加」をクリックすることで設定できます。

オーダー日を選択します。

2021、2022のみチェックを入れます。

オーダー日を2021,2022年でフィルターを設定できました。

動作結果確認

抽出結果を確認すると、オーダー日が2021,2022年のみのデータになっています。

集計

どういう機能なのか触るまでイメージが付かなかったのですが、
ディメンションを集計キーにして、メジャー項目を合計する機能です。

準備

以下のデータで動作を確認します。

集計前の状態は以下となります。

動作結果確認

  • 表示されているディメンションでデータを集計

「表示されているディメンションでデータを集計」にチェックを入れて、抽出を作成します。

わかりにくいかもしれませんが、2021年1月1日の地域A、カテゴリXを集計前の状態と見比べる先ほどは2レコードあった行が1レコードに集約されています。
メジャー項目の売上、利益、testのカウント(レコード数)が合計されています。

  • 次の単位で日付をロールアップ

「次の単位で日付をロールアップ」にチェックを入れ、年を設定し抽出を作成します。

日単位で持っていたオーダー日は2021年1月1日、2022年1月1日として集約されます。

補足:日付データ項目が複数ある場合

日付データ項目が複数ある場合は、日付の項目をすべて加味した集約結果となります。
以下のデータを月単位でロールアップします。

「オーダー日」+「到着日」で集約されます。

行数

抽出するレコード数を減らすことができます。
データ量を減らして処理負荷を軽減する用途で使用する機能です。

準備

以下のデータで確認をします。

動作結果確認

  • 「すべての行」の場合

すべてのレコードを対象とします。特に何も設定しない場合はこちらを設定します。
また、すべての行を選択した場合のみ増分更新が設定できます。
(※増分更新については後ほど動作を確認します。)

すべての行を設定し抽出します。

すべてのデータ、つまりNo.1~10までのデータが抽出されています。

  • 「上」の場合

データソースを上から任意の行を抽出する設定ができます。
上:5行 で抽出を行います。

No.1~5のみデータが抽出されました。

  • 「サンプル」の場合

レコードを(おそらく)ランダムに指定行数(もしくは%)抽出します。
サンプル:5行 で抽出します。

5行抽出されました。Noを見るとバラバラに抽出されていることがわかります。

抽出を更新すると抽出されるレコードは変更されます。

増分更新をいろいろなデータ更新パターンで動作を確認する

Tableauでは抽出の更新方法として、「完全更新」と「増分更新」があります。
完全更新」では文字通り更新時に抽出データすべて置き換えします。
増分更新」ではデータソース側にデータが追加された分だけを更新(追加)します。

増分更新の設定では、ある列(データ項目)を増分更新有無の判定に指定します。
例えば、日付の列を指定した場合は、その最終更新日以降のデータが追加された場合に新しいデータと判定されます。

詳細は公式ヘルプをご確認ください。
https://help.tableau.com/current/pro/desktop/ja-jp/extracting_refresh.htm

増分更新を設定する

増分更新の設定と通常の増分更新の動作確認を行います。

以下のデータに対し、日付(オーダー日)を指定して増分更新を設定していきます。

「列を使用して新しい行を指定します」にオーダー日を設定します。

増分更新前の状態は以下。

最新日時以降のデータとしてNo11を追加します。

増分更新を行います。

新たにNo.11のデータが追加されました。
通常の動作確認ができたところで、いろいろな更新パターンでの増分更新の挙動を確認していきます。

いろいろな更新パターンで確認する

値の更新の場合

レコードの増加ではなく、値を変更した場合を確認します。増分が反映できているか確認用にNo.12を追加しています。

増分更新を行ってもこの場合は反映されないようです。

レコードを削除した場合

No.11のレコードを削除しました。No.13は増分更新の確認用です。

この場合も増分更新では反映されないようです。

最新更新日以前または同じ日付のレコード増加の場合

最新更新日の2021/1/11より前のデータとしてNo.14、最新更新日と同じ日のデータとしてNo.15を追加しました。No.16は増分更新の確認用です。

この場合も増分更新では反映されないようです。

ここまでの3パターンを反映したい場合

完全更新で反映することができます。
レコード増加以外の更新が発生する場合は完全更新を実行する必要がありそうです。

まとめ

データの抽出はあまり細かい設定をしたことがなかったのでいろいろ動作を見ていて楽しかったです。
特に増分更新は使い方がわかっていないとデータ元を更新したのに何で反映されないんだ?という事態になりそうだったのでここを知ることができたのは良かったです。

今回「データの抽出」ダイアログの設定項目の動作を確認しましたが、抽出に関連する操作はまだあったりするのでそのあたりもどこかで確認できたらなと思いました。

ここまで読みいただきありがとうございました。