【Talend Open Studio 入門03】tMapでマスタデータを紐づける方法

はじめに

みなさん、こんにちは!

今回は、Talend入門第3回目です。
前回記事はこちら⇒【Talend Open Studio 入門02】CSVデータを変換する。まずはファイル操作でしょ!

内容としては、前回少し触ったtMapというコンポーネントの使い方をもっと掘り下げていきましょう、というものです。
以前少し書きましたが、tMapというコンポーネントは、極めて重要です。
ETL(Extract, Transform, Load)のTransform(変換)を担っています。
多くの変換はtMapにて行いますので、この使い方を知っておくのは本当に重要なんです。しつこいですね。失礼しました。

それでは、早速バッチジョブを開発しながらtMapの理解を深めていきましょう。

 

今回作るバッチジョブについて

山田さん(作り手)と支店長の会話

ここはとある販売会社です。第2回の時と同じ会社です。
前回、山田さん(作り手)は、支店長からのタスクを30分でこなしました。
信頼を勝ち得た山田さんは、支店長から次なるタスクを受けます。

支店長
はぁ…こまった…
山田
どうしました?
支店長
君も知っての通り、我々は最近販売システムを新システムに切り替えた。その時に、旧システムの販売データは取り込まない、という方針でことが進んでいたんだ。
山田
はい。存じ上げております。
支店長
ところが、最近現場から、旧システムのデータも見れないと不便で仕方がない、という苦情があがっているんだ。
支店長
なので、なんとか旧システムのデータを、新システムに移行したいんだが、如何せん項目が違ってね…
山田
なるほど。前回と同じ様な項目変換でしょうか。でしたら、私なら30分で実装できますよ。
支店長
ありがとう。ただ、今回扱うデータは、単なる項目変換だけではダメなんだ。旧システムは、csvとして残っているデータが全て正規化されていてな。項目の名称等がデータに残っていないんだ。
支店長
なので、品目コードから品目名称を取得それをcsvに吐かないといけないんだ。流石の君でも、マスタデータを突合して新たなファイルを出力するなんてことは…
山田
大丈夫です。30分で実装できますよ。そう。Talendならね。
支店長
な、なんと!是非お願いしたい!!

会話をまとめると…

支店長の課題は、

  • 元々あったcsvの販売実績データを変換したい
  • しかし、その実績データの項目にはコード類しか存在せず、名称などの情報が無い
  • 出力データには名称などの情報が必要
    • 品目名称については、品目マスタデータにより品名の取得が必要
  • 困っている…

とりあえずこんな感じですね。

仕様をもっと具体的に

もう少し具体的に仕様を決めておきましょう。

  • 旧システムの項目は下記の通り
    • ID,ITEM_CD,SUURYO,TANNI
  • 新システムの項目は下記の通り
    • ID,ITEM_CD,ITEM_NAME,SUURYO,TANNI
  • 旧システムのITEM_CDからITEM_NAMEを引くためのcsvマスタデータ項目は下記の通り
    • ITEM_CD,ITEM_NAME

サンプルデータとして、旧システムの実績データ、品目マスタデータは下記のような感じとしましょう。

【旧システム販売実績データ】

ID,ITEM_CD,SUURYO,TANNI
0000000001,"0000000001",3,"個"
0000000002,"0000000004",11,"個"
0000000003,"0000000001",2,"ダース"
0000000004,"0000000015",1,"箱"
0000000005,"0000000009",13,"個"
0000000006,"0000000031",7,"箱"
0000000007,"0000000004",4,"ダース"

【品目マスタデータ】

ITEM_CD,ITEM_NAME
0000000001,"りんご"
0000000004,"みかん"
0000000009,"すいか"
0000000015,"メロン"
0000000031,"パイナップル"

csvデータは下記のからダウンロードできます。
トランザクションのcsvデータ,品目マスタのcsvデータ

山田さんは頼もしいことに、Talendならすぐに実装できると言っています。
早速私たちも実装していきましょう!少しはtMapの実力が分かるはずです。

 

実装

最初は前回の復習です

まずはジョブを作りましょう。作り方は前回記事を参照してください。
ジョブを作ったら、まずは、前回同様、

  1. tFileInputDelimited
  2. tMap
  3. tLogRow

のコンポーネントをジョブに落としていきます。
とりあえず、実績データcsvの読み込みができていることを確認するためです。

image34

 

このあたりは、前回と全く同じ内容ですね。
tFileInputDelimitedコンポーネントのファイル名/ストリーム、CSVオプションチェックなど、オプションを正しく設定しておきましょう。

そして、忘れてはいけないスキーマの編集です。
このコンポーネント設定の[スキーマの編集]の右隣のボタンから、入力ファイルの項目を定義します。

image35

入力ファイルは仕様通り、上記の4項目ですので、その通りに入力しました。
一応、SUURYOの項目は数値っぽいのでIntegerに設定します。

tMapの編集

次に、tMapコンポーネントを編集します。
1

要件の出力では、ITEM_NAMEが追加されていますので、tMapのout1にも追加しておきます。
とりあえず、現時点では値セットができないので空欄でokです。
また、出力と入力が同一項目名の場合は、画面右上の[自動マップ]ボタンを押下すると、勝手にout側にin側のリンクを行ってくれます。大変便利です。

2

とりあえず、tMapの設定が終わり、tLogRowまで配置&Row接続ができたら、ジョブ実行してみましょう。

キャプチャ

今回のテストデータをそのまま流した場合は、7レコード出力されると思います。上記の通り出力されていれば、とりあえずokです。

これで一旦、ファイル入力⇒tMap(処理なし)⇒ログ出力のフローまで確認ができました。

tMapでマスタデータ紐づけを行う

今回は、ここからが本番です!
次に、新たな入力ファイルを読み込みましょう。突合するためのマスタデータcsvですね。
新たにtFileInputDelimitedコンポーネントを配置します。
そして、下記の通り設定を行います。

4

品目マスタデータのcsvを、[ファイル名/ストリーム]に指定し、後は画面の通り、csvに関するオプションを設定します。
設定が完了したら、tMapにRow接続します。この時、Rowの下にLookupと出ると思いますが、それで正しいです。
また、tFIleInputDelimitedのスキーマは仕様の通り、ITEM_CD, ITEM_NAMEを項目として追加しておきます。

5

今度は、tMapの設定を行います。

6

先ほどと異なり、左側の入力に、row2が追加されていることが確認できます。

ただ、このままですと、row1とrow2には一切関係を示すキーが記載されていません。
この状態のまま、一度ジョブを走らせてみると、想定と全く異なる結果が得られます。

7

row1からは7レコード、row2からは5レコードの入力がtMapに接続されていますね。
ここまでは想定通りです。
が、tMapからの出力はなんと…35レコードです。
えっ!なにこれ!
はい。データベースを学んだことがある方なら、ピンとくると思います。
SQLで、複数テーブルからジョインして結果のレコードを得る時に、キーを指定しないと、テーブル1のレコード数*テーブル2のレコード数分の結果が得られてしまうと思います。
まさに、TalendのtMap内でも同じことが起きてしまっていて、結果が35レコード(7*5レコード)となってしまいました。

トランザクションデータとマスタデータを紐づけるキーの設定

というわけで、tMap内でジョイン時のキーを設定します。
今回、仕様にもある通り、品目コードから品名を引いてくる、ということなので、row1とrow2を品目コードで紐づけます。

8

紐づけの仕方は、tMapのエディタ内で、Lookupに指定されていたRow接続側の[式キー]に、どの項目と紐づけるかを式で記述します。
今回の場合は、row2の[式キー]に、row1.ITEM_CDと書きます。
row1とrow2の品目コードで紐づけを行いますからね。

動作確認

これで、tMapの編集は完了です。
この状態で実行すると、先ほどとは違って、結果が7レコード、ITEM_NAMEを意味する項目に、品目マスタcsvから品目コードに紐づく名称がセットされていることが確認できるはずです。

9

結果は想定通りですね。

まとめ

まとめると、

  • tMapにて、複数の入力ソースの情報を(SQLのJOINみたく)紐づけることができる

という感じですね。

次回は、tMapのフィルタ機能を取り上げていきたいと思います。

次回記事はこちら⇒【Talend Open Studio 入門04】tMapのフィルタリング機能とVarの使い方

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です