TalendでCSV入力にマスターデータを結合(Join)するには


ETLで実行したい処理の一つが、入力データにマスターデータを追加する処理です。

Talendの公式チュートリアル 5minDemoの3番目「Set up a Join」が、ちょうどマスターデータを参照する処理のチュートリアルになっています。
5minDemoチュートリアルは4つのセクションに分かれており3つめがこのJoinの例になっており、「1. Talend Open Studio for Data Integration Overview」と「2. tMap Essential Features」に続けて実施する構成になっています。
「Set up a Join」の手順を進めるにあたって最低限必要な部分のみ1、2の手順を実施した後に、複数データソースを結合する処理を追加していく手順をまとめてみました。

このデモでは、入力のCSVファイルCustomerのState列の値を、条件「CSVファイルCustomerのState列とStatesテーブルPostalカラムの値が等しい」マスターデータStatesテーブルの行のStateカラムに置き換えます。

JoinOnCustomerStateAndStatesPostal

以下の手順は、Talend Open Studioは、Data Integration 5.5で確認しています。

前準備CSV読み込みまで

まず、プロジェクトを作成してCSV入力をログにそのまま出力する処理をセットアップします。

1. チュートリアルデータのダウンロード

まずは、チュートリアルページからチュートリアル用のデータ exampleFile.zip をダウンロードして解凍します。

2. チュートリアル用プロジェクトの作成

Talend Studioを起動して新規プロジェクト「Demo5」を作成し、新規ジョブ「Demo5min」を作成します。

NewJobDemo5min

3. チュートリアル用データCSVファイルを[区切り記号付きファイル]として定義

CSVファイル「customers_demo5mn.csv」を入力とする[区切り記号付きファイル]を追加します。

この辺りの手順は、Talend Open Studio for Data Integration Overviewも参考にしてください。

3.1 リポジトリから[メタデータ] > [区切り記号付きファイル] > [区切り記号付きファイルの作成を]選択し、[区切り記号付きファイル]ウィザードを開きます。

3.2 新規区切り記号付きファイル ステップ1: Nameに「Customer」を入れて[次へ]

3.3 新規区切り記号付きファイル ステップ2: ファイルで「customers_demo5mn.csv」を選択して[次へ]

AddNewFileDelimited_step2

3.4 新規区切り記号付きファイル ステップ3: [列名として先頭行を設定]にチェックを入れて[プレビューのリフレッシュ]、CSVの内容を確認して[次へ]

AddNewFileDelimited_step3

3.5 新規区切り記号付きファイル ステップ4: [名称]に「Customer」と入力、[スキーマの説明]で「id」列のみ[キー]としてチェックを入れて[次へ]

AddNewFileDelimited_step4

区切り記号付きファイル「Customer」が[メタデータ]>[区切り記号付きフィアル]に下に追加されました。

NewFileDelimitedAdded

4. CSV入力を[tMap]を介して[tLogRow]に出力

次に、Talend Tutorials – 5mn Demo – tMap Essential Featuresを参考に「customers_demo5mn.csv」がセットされた[区切り記号付きフィアル]を入力として、[tMap]に接続し、[tMap]の出力を[tLogRow]を使ってログとして確認するところまで実装します。

4.1. 3.で追加した[区切り記号付きファイル] > [Customer]ををジョブのキャンバスにドロップして[tFileInputDelemited]を選択します。

4.2 続いてパレットより[tMap]、[tLogRow]コンポーネント選択してキャンバスに追加します。

4.3 入力と出力を以下のようにつなげます。

tMap2tLogRow_1
この状態では、[tMap]の出力スキーマが定義されていないため警告が出ています。

4.4 [tMapエディタ]を開き入力を出力につなげます。
キャンバス上の[tMap_1]をダブルクリックして[tMapエディタ]を開きます。
ここでは、入力のカラムをすべてそのまま出力するように設定します。

tMap2tLogRow_2
※ チュートリアルでは、式を作成して[式ビルダ]を開き「lastname」を大文字に変換する処理を追加しますがここではJoinを試すことが目的なので割愛して先に進めます。

4.5 [tLogRow]でも出力スキーマをセット
[tMap]を設定するとエラーはなくなりますが、このまま実行すると[tLogRow]でスキーマの対応がないとエラーになる場合があります。
このときは、[tLogRow]を選択して[カラムの同期]をクリックして入力カラムを全て出力対象としてセットします。

tLogRow_synchColumns

5. ジョブ実行して確認

一旦、ここまでに定義したジョブを実行して動作を確認しておきます。
[実行(ジョブ Demo5min)]タブを選択して[実行]ボタンをクリックして、ジョブを実行します。
RunDemo5minJob_1

次から、目的のSet up a Joinの確認に入ります。

CSV入力にマスターデータと結合させたデータを出力する

1. マスターデータをMySQLにロード

マスターデータの「states_demo5mn.txt」をMySQLにロードします。

チュートリアル用のデータベース「5MinDemo」を作成して、テーブルを「states」を追加します。

mysql> create database 5minDemo default character set utf8;
Query OK, 1 row affected (0.00 sec)

mysql> use 5minDemo
Database changed
mysql> CREATE TABLE `states` (
    ->   `ID` int(11) NOT NULL AUTO_INCREMENT,
    ->   `Postal` varchar(2) NOT NULL,
    ->   `State` varchar(14) NOT NULL,
    ->   `Capital` varchar(14) NOT NULL,
    ->   `MostPopulousCity` varchar(14) NOT NULL,
    ->   PRIMARY KEY (`ID`)
    -> );
Query OK, 0 rows affected (0.01 sec)

続けて、「states_demo5mn.txt」ファイルをテーブルにロードします。

mysql> LOAD DATA INFILE "/Users/hrendoh/Downloads/014/states_demo5mn.txt" INTO TABLE states FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES;
Query OK, 50 rows affected, 2 warnings (0.00 sec)
Records: 50  Deleted: 0  Skipped: 0  Warnings: 2

2.「states」テーブルのデータを入力として定義

チュートリアルSet up a Joinに沿って「states」テーブルを入力として定義します。

2.1. [メタデータ] > [DB接続] を選択して、コンテキストメニューを表示、メニューから[新規DB接続]を選択して、[DB接続]ウィザードを開きます。

2.2. ステップ1: [Name]に「5MinDemo」と入力して[次へ]

2.3. ステップ2: 以下のように各項目をセット

Demo5MinDatabaseConnection

DB Type: MySQL
ログイン: root
パスワード: xxxxx
サーバー: localhost
ポート: 3306
DataBase: 5minDemo

[チェック]ボタンをクリックして接続に成功したら[終了]をクリック

[メタデータ] > [DB接続]に「5MinDemo」が追加されました。

Demo5minDatabaseConnectionAdded

2.4. 追加された[5minDemo 0.1]でコンテキストメニューを表示し[スキーマ情報の取得]をクリックして[Schema]ウィザードを開きます。

2.5. テーブルをフィルタ: デフォルトのまま[次へ]

2.6. リポジトリに新規スキーマを追加: テーブル「states」を選択して[次へ]

2.7. リポジトリに新規スキーマを追加: [スキーマ]の内容を確認して[終了]

[5minDemo 0.1] > [テーブル]の下に[states]が追加されました。

Demo5minSchemaAdded

3. マスターデータ テーブル「states」を入力としてジョブに追加

[メタデータ] > [DB接続] > [5minDemo 0.1] > [テーブル] > [states]をジョブキャンバスにドロップし、コンポーネント[tMysqlInput]を選択します。

tMysqlInputAdded

4. SQL BuilderでSELECTするカラムを設定

4.1. ドロップした[states(tMysqlInput)]のコンポーネントビューを表示して、[クエリ]の右の[…]ボタン(以下の画像中の赤で囲んだボタン)をクリックしてSQL Builderを表示します。

Talend_tMysqlInput_ShowQueryBuilderButton

4.2. SQL Builderが開いたら右側の[5minDemo(5MinDemo).sql]ビューで[デザイナ]タブを選択、[デザイナ]で「Postal」と「State」カラムのみ残して他のカラムはチェックを外す。一番左のクエリ実行アイコンをクリックして左下の[クエリ結果: 1]ビューに修正したクエリーで取得したデータを確認。[OK]してウィンドウを閉じます。

Talend_SQLBuilder

5. マスターデータ テーブル「states」の入力を[tMap]に接続

[states]の出力を[tMap_1]につなぎます。[row2 (lookup)]

ConnectMasterDataInputTotMap

[states]の右上の警告を確認すると「スキーマのデータタイプがこのコンポーネントに合っていないよ」と表示されています。
今回のチュートリアルでは、このままでも問題ないですが、一応解消しておきます。

[states(tMysqlInput)]の[コンポーネントビュー]で[Guess Schema]をクリックしてスキーマ情報を更新します。

tMysqlInputGuessSchema

[スキーマ:”states”]ウィンドウが開きます。
リストされているカラムがSELECTに指定したもののみに更新されていることを確認できます。
ここで、さらにDBタイプを以下のようにそれぞれ「states」テーブルに合わせて「VARCHAR」にセットします。

tMysqlInputGuessedSchema

この設定をすると、[states]の右上の警告が消えます。

5.[tMap]でマスター「states」の入力を「Customer」に結合

[tMap]コンポーネントをダブルクリックして[tMapエディタ]を開きます。

JoinCsvAndMasterDatatMapEditor

6. ジョブを実行して確認

ジョブを実行すると、CSV入力Customerのstate列の値をMySQLのstatesテーブルから取得した値に置き換えられていることを確認できます。

RunDemo5minJob_2
元のチュートリアルではこれをMySQLのCustomerテーブルに出力していますが、結合の手順を確認できたので、ここまでにします。

参照

CSVをMySQLへ出力方法については、「オープンソースETLツールTalendでExcelのデータをデータベースにロードしてみた」も参考にしてみてください。

tMapを利用したフィルタリングにはTalendのサンプルサイトTalend by Exampleの「
tMap Joins & Filtering
」も参考になります。

,