Tableau Desktop 10 新機能:クロスデータベースジョイン機能を試してみる #tableau

2016.06.10

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

Tableau 10 新機能紹介シリーズ、当エントリは『クロスデータベースジョイン』機能に関する、正式リリース前の先取り内容紹介となります。複数のデータソースをTableau上で結合(join)させ、1つのデータソースとして扱える様にするという機能です。

tableau10-comming-soon_00

目次

データの準備

今回のこの機能を試すために、それぞれのデータソースとして用意する『元ネタ』をまずは入手します。以下サイトから、映画のレイティング(評価)に関するデータがそこそこのボリュームあるので、これを使いたいと思います。

tableau10-new-features_cross-database-join_01

ダウンロード後、解凍。一番多いデータでratings.csvの2288万件、次いでtags.csvが58万件となっています。これらをそれぞれ、異なるデータソースの環境に突っ込みたいと思います。

$ cd Desktop/ml-latest/
$ ll
total 1257384
-rw-r--r--@ 1 xxxxxxxxx  staff       8305  1 29 11:41 README.txt
-rw-r--r--@ 1 xxxxxxxxx  staff     725747  5 26 10:37 links.csv
-rw-r--r--@ 1 xxxxxxxxx  staff    1729811  1 29 11:37 movies.csv
-rw-r--r--@ 1 xxxxxxxxx  staff  620204630  1 29 11:32 ratings.csv
-rw-r--r--@ 1 xxxxxxxxx  staff   21094823  1 29 11:22 tags.csv
$ wc links.csv 
   34208   34208  725747 links.csv
$ wc movies.csv 
   34209  155908 1729811 movies.csv
$ wc ratings.csv 
 22884378 22884378 620204630 ratings.csv
$ wc tags.csv 
  586995  964414 21094823 tags.csv
$

環境準備:Amazon Redshift

まずはAmazon Redshift。一番件数の多いratingsデータをこの環境に投入します。

# DROP TABLE IF EXISTS public.tabv10_mlratings;
CREATE TABLE public.tabv10_mlratings (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  rating FLOAT,
  timestamp_bigint BIGINT
);
CREATE TABLE

# \timing
Timing is on.

# COPY public.tabv10_mlratings
FROM 's3://xxxxxxxxxxxxxxxxxxxx/movielens/ratings.csv'
CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY'
IGNOREHEADER 1 CSV;
INFO:  Load into table 'tabv10_mlratings' completed, 22884377 record(s) loaded successfully.
COPY
Time: 41639.793 ms

# SELECT COUNT(*) FROM public.tabv10_mlratings;
  count   
----------
 22884377
(1 row)

Time: 221.462 ms

環境準備:RDS(MySQL)

次いでMySQL。同じAWS環境下にRDSのMySQLを立ち上げ、

tableau10-new-features_cross-database-join_02

データベースに接続。今回CSVをローカルからインポートしたかったのでログインの際に--local-infileオプションを付与しています。

$ mysql --local-infile=1 -h cm-mysqldb.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com -P 3306 -u xxxxxxx -p

テーブルを作成し、

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cmmysqldb          |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.17 sec)

mysql> USE cmmysqldb;
Database changed

# CREATE TABLE tabv10_mltags (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  tags VARCHAR(300),
  timestamp_bigint BIGINT
);
Query OK, 0 rows affected (0.36 sec)
mysql>

データ投入。(実際は1行で実行しています)

mysql> LOAD DATA LOCAL INFILE '/Users/xxxxx/xxxxxx/ml-latest/tags.csv' 
INTO TABLE cmmysqldb.tabv10_mltags
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';

Query OK, 586995 rows affected, 584 warnings (6.21 sec)
Records: 586995  Deleted: 0  Skipped: 0  Warnings: 584

環境準備:Microsoft Access

業務としてありそうなケースを想定してみる、という事で3つ目のデータソースはAccessを選んでみました。こちらは手元の環境でAccessを使えなかったのでWindows環境下でaccessファイルを作成してみる事にしました。

Accessを起動し、[外部データ]→[テキストファイル]を選択。

tableau10-new-features_cross-database-join_03

取り込み対象のCSVファイルを指定し、取り込み実施。

tableau10-new-features_cross-database-join_04

このような感じで無事取込んでファイルを作成する事が出来ました。

tableau10-new-features_cross-database-join_05

環境準備:CSV

4つめの環境はファイルをそのまま、CSVとして取込む形で行きたいと思います。という事で割愛。

いざ、ジョイン!

さぁ、これで異なる4つのデータソースが揃いました。以下手順で1つずつデータソースを結合させて行きたいと思います。

  • ratings.csv [Amazon Redshift]
  • tags.csv [RDS(MySQL)]
  • links.csv [Microsoft Access]
  • movies.csv [CSV File]

1つ目のデータソース: Amazon Redshiftの作成

まずはAmazon Redshift。従来通りの手順で準備出来ました。バージョン10からは以下の様な表記でデータソース名も出るようになってるんですね。

tableau10-new-features_cross-database-join_06

tableau10-new-features_cross-database-join_07

2つ目のデータソース: RDS(MysQL)の作成&データソースの結合

2つ目のデータソース、RDS(MySQL)についても作成は従来通り。[追加]ボタンが新設されていますのでそこから新たなデータソースを追加を行います。

tableau10-new-features_cross-database-join_08

データソース作成後、キー同士を結合させる形でデータベーステーブル同士をジョイン。ご覧の様に、異なるデータベースのテーブルがTableau上で繋がるようになりました!

tableau10-new-features_cross-database-join_09

3つ目のデータソース: Microsoft Accessの作成&データソースの結合

本来なら2つ目で『繋がったね、良かったね』で終えても良いと思うのですが、おまけでもう2つ行っちゃいましょう。Accessについてはファイルを指定して読み込み、データソースとして接続します。

tableau10-new-features_cross-database-join_11

3つ目のデータソースも無事結合させる事が出来ました。

tableau10-new-features_cross-database-join_12

4つ目のデータソース: CSVファイルの作成&データソースの結合

そして最後4つ目のデータソース。CSVファイル。こちらもテキストファイルとして読み込み、キーで結合させてあげます。合計4つのデータソースがTableau上で1つのデータソースとして結合出来ました!

tableau10-new-features_cross-database-join_13

まとめ

以上、Tableau 10の新機能、『クロスデータベースジョイン』を実際に試してみたエントリでした。

ただ今回のケース、元となるデータが2000万件ある形で残り3つのデータソースと結合させるというのは相当に時間が掛かり、おパフォーマンスも必要としていました。(初回結合時で20分近く掛かり、端末もファンが暫く唸りを上げていた) この機能、とても便利な機能ではありますが、大量件数での処理となるとやはり相当パワー・パフォーマンスを必要とする様です。今回の様なケースの場合、まず少なめの件数(数万件、行っても数十万件レベルでしょうか)で試してみてどの様な結果が得られるかを検証し、ある程度目処が付いたところで一箇所に集約する(今回の場合であればAmazon Redshiftへ)、というステップを踏んで分析環境を整えていく方が望ましいでしょう。一旦接続まで行った後に『抽出ファイル』をまず作成しておいてそれを使う、というのもひとつの手です。いずれにしても、この機能はこれまで出来なかった事が出来るようになった!という事で大変嬉しい機能だと思います。是非お試し頂ければ幸いです。