『データウインドウ』で接続時のテーブル間結合がより簡単に – Tableau Desktop 8.2 新機能紹介

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

Tableau Desktopでは、データソースへの接続設定時に復数のテーブルを任意の項目で結合させた形で利用する事が可能となっています。新しくリリースされたバージョン8.2では、その機能が『データウインドウ』という形でより便利に使い易くなりました。当エントリではその部分についてサラっとご紹介したいと思います。

事前準備

今回のケースを再現する為に、Amazon Redshiftでデータベース環境を用意してみました。(※同じ様なデータ構造であれば、これから作るテーブル=EXCELのシート、という構成でも再現出来ると思います。その辺りは読み替えて観てください。)

下記のAmazon Redshift公式ドキュメント:入門ガイドで紹介されているAmazon公式データ(とでも呼べばよいでしょうか)を利用する事にします。

Amazon Redshiftでクラスタを立ち上げ、接続可能な状態にした上で今回検証用のスキーマ(cm_demo)を構築。その中に上記ページで紹介されているテーブルを作成します。

create table cm_demo.users (
    userid integer not null distkey sortkey,
    username char(8),
    firstname varchar(30),
    lastname varchar(30),
    city varchar(30),
    state char(2),
    email varchar(100),
    phone char(14),
    likesports boolean,
    liketheatre boolean,
    likeconcerts boolean,
    likejazz boolean,
    likeclassical boolean,
    likeopera boolean,
    likerock boolean,
    likevegas boolean,
    likebroadway boolean,
    likemusicals boolean);
 
create table cm_demo.venue (
    venueid smallint not null distkey sortkey,
    venuename varchar(100),
    venuecity varchar(30),
    venuestate char(2),
    venueseats integer);
 
create table cm_demo.category(
    catid smallint not null distkey sortkey,
    catgroup varchar(10),
    catname varchar(10),
    catdesc varchar(50));
 
create table cm_demo.date (
    dateid smallint not null distkey sortkey,
    caldate date not null,
    day character(3) not null,
    week smallint not null,
    month character(5) not null,
    qtr character(5) not null,
    year smallint not null,
    holiday boolean default('N'));
 
create table cm_demo.event (
    eventid integer not null distkey,
    venueid smallint not null,
    catid smallint not null,
    dateid smallint not null sortkey,
    eventname varchar(200),
    starttime timestamp);
 
create table cm_demo.listing (
    listid integer not null distkey,
    sellerid integer not null,
    eventid integer not null,
    dateid smallint not null  sortkey,
    numtickets smallint not null,
    priceperticket decimal(8,2),
    totalprice decimal(8,2),
    listtime timestamp);
 
create table cm_demo.sales (
    salesid integer not null,
    listid integer not null distkey,
    sellerid integer not null,
    buyerid integer not null,
    eventid integer not null,
    dateid smallint not null sortkey,
    qtysold smallint not null,
    pricepaid decimal(8,2),
    commission decimal(8,2),
    saletime timestamp);

そして、以下COPYコマンドでテーブルにデータを投入。クレデンシャルの部分は適宜用意した上でお願いします。

COPY cm_demo.users FROM 's3://awssampledbuswest2/tickit/allusers_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|';

COPY cm_demo.venue FROM 's3://awssampledbuswest2/tickit/venue_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|';
 
COPY cm_demo.category FROM 's3://awssampledbuswest2/tickit/category_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|';

COPY cm_demo.date FROM 's3://awssampledbuswest2/tickit/date2008_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|';
 
COPY cm_demo.event FROM 's3://awssampledbuswest2/tickit/allevents_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|'
TIMEFORMAT 'YYYY-MM-DD HH:MI:SS';

COPY cm_demo.listing FROM 's3://awssampledbuswest2/tickit/listings_pipe.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '|';
 
COPY cm_demo.sales FROM 's3://awssampledbuswest2/tickit/sales_tab.txt'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
DELIMITER '\t'
TIMEFORMAT 'MM/DD/YYYY HH:MI:SS';

件数確認。ちゃんとデータが入っている事が確認出来ました。

# SELECT COUNT(*) FROM cm_demo.users;
 count 
-------
 49990
(1 行)

# SELECT COUNT(*) FROM cm_demo.venue;
 count 
-------
   202
(1 行)

# SELECT COUNT(*) FROM cm_demo.category;
 count 
-------
    11
(1 行)

# SELECT COUNT(*) FROM cm_demo.date;
 count 
-------
   365
(1 行)

# SELECT COUNT(*) FROM cm_demo.event;
 count 
-------
 17596
(1 行)

# SELECT COUNT(*) FROM cm_demo.listing;
 count  
--------
 192497
(1 行)

# SELECT COUNT(*) FROM cm_demo.sales;
 count  
--------
 172456
(1 行)

データウインドウでの操作について

では、実際にデータウインドウを操作してみましょう。Tableau 8.2を起動、接続先に[Amazon Redshift]を選択して必要な接続情報を入力、[接続]押下。

tableau82-data-window-01

分析対象となるテーブルを含むスキーマを選択します。上記で作成した[cm_demo]スキーマを選択すると、作成したテーブルが表示されました。

tableau82-data-window-02

試しに、同じ項目『velue_id』を持つテーブル、eventとvenueをドラッグ&ドロップしてみました。すると、自動的に内部結合で連結してくれました!この操作は任意のテーブルの任意の項目同士を手動で結合する事も可能です。また、ご覧の様に結合タイプも様々なタイプで結合させる事が出来ます。

tableau82-data-window-03

eventテーブルとその他3テーブルを結合させてみました。データシートに移動します。

tableau82-data-window-04

ご覧の様に、ディメンション及びメジャーの部分に、結合した各テーブルの要素がそれぞれ配置されました。

tableau82-data-window-05

以下、グラフの作成例。

tableau82-data-window-06

まとめ

以上、データウインドウに関する解説でした。Tableau上でのテーブル間結合がより分かり易くなったのでデータベースに詳しい人は勿論、EXCEL等で普段分析をされている人で『データベースはちょっと...』という方でもこの辺りのイメージがし易いものになったのではないでしょうか。

テーブル間同士の結合が出来ると言うのはメリットとなる一方、大量のデータ件数を保有するテーブル同士を結合させるような場合、状況に拠っては想定を遥かに超える負荷や時間が掛かる可能性があります。その際には、Redshift内部で予め結合した結果を格納するテーブルを別途用意しておき、分析前にバッチ処理等でその生成SQLを実行、Tableauからはその分析結果格納用テーブルを見に行く、という形を取った方が良いかも知れません。この辺り、用法用量を正しく見極めて使い分けたいところですね。私からは以上です。