はじめに
みなさん、こんにちは!
今回は、Talend入門第3回目です。
前回記事はこちら⇒【Talend Open Studio 入門02】CSVデータを変換する。まずはファイル操作でしょ!
内容としては、前回少し触ったtMapというコンポーネントの使い方をもっと掘り下げていきましょう、というものです。
以前少し書きましたが、tMapというコンポーネントは、極めて重要です。
ETL(Extract, Transform, Load)のTransform(変換)を担っています。
多くの変換はtMapにて行いますので、この使い方を知っておくのは本当に重要なんです。しつこいですね。失礼しました。
それでは、早速バッチジョブを開発しながらtMapの理解を深めていきましょう。
今回作るバッチジョブについて
山田さん(作り手)と支店長の会話
ここはとある販売会社です。第2回の時と同じ会社です。
前回、山田さん(作り手)は、支店長からのタスクを30分でこなしました。
信頼を勝ち得た山田さんは、支店長から次なるタスクを受けます。
会話をまとめると…
支店長の課題は、
- 元々あったcsvの販売実績データを変換したい
- しかし、その実績データの項目にはコード類しか存在せず、名称などの情報が無い
- 出力データには名称などの情報が必要
- 品目名称については、品目マスタデータにより品名の取得が必要
- 困っている…
とりあえずこんな感じですね。
仕様をもっと具体的に
もう少し具体的に仕様を決めておきましょう。
- 旧システムの項目は下記の通り
- ID,ITEM_CD,SUURYO,TANNI
- 新システムの項目は下記の通り
- ID,ITEM_CD,ITEM_NAME,SUURYO,TANNI
- 旧システムのITEM_CDからITEM_NAMEを引くためのcsvマスタデータ項目は下記の通り
- ITEM_CD,ITEM_NAME
サンプルデータとして、旧システムの実績データ、品目マスタデータは下記のような感じとしましょう。
【旧システム販売実績データ】
[text] ID,ITEM_CD,SUURYO,TANNI0000000001,"0000000001",3,"個"
0000000002,"0000000004",11,"個"
0000000003,"0000000001",2,"ダース"
0000000004,"0000000015",1,"箱"
0000000005,"0000000009",13,"個"
0000000006,"0000000031",7,"箱"
0000000007,"0000000004",4,"ダース"
[/text]
【品目マスタデータ】
[text] ITEM_CD,ITEM_NAME0000000001,"りんご"
0000000004,"みかん"
0000000009,"すいか"
0000000015,"メロン"
0000000031,"パイナップル"
[/text]
csvデータは下記のからダウンロードできます。
トランザクションのcsvデータ,品目マスタのcsvデータ
山田さんは頼もしいことに、Talendならすぐに実装できると言っています。
早速私たちも実装していきましょう!少しはtMapの実力が分かるはずです。
実装
最初は前回の復習です
まずはジョブを作りましょう。作り方は前回記事を参照してください。
ジョブを作ったら、まずは、前回同様、
- tFileInputDelimited
- tMap
- tLogRow
のコンポーネントをジョブに落としていきます。
とりあえず、実績データcsvの読み込みができていることを確認するためです。
このあたりは、前回と全く同じ内容ですね。
tFileInputDelimitedコンポーネントのファイル名/ストリーム、CSVオプションチェックなど、オプションを正しく設定しておきましょう。
そして、忘れてはいけないスキーマの編集です。
このコンポーネント設定の[スキーマの編集]の右隣のボタンから、入力ファイルの項目を定義します。
入力ファイルは仕様通り、上記の4項目ですので、その通りに入力しました。
一応、SUURYOの項目は数値っぽいのでIntegerに設定します。
tMapの編集
要件の出力では、ITEM_NAMEが追加されていますので、tMapのout1にも追加しておきます。
とりあえず、現時点では値セットができないので空欄でokです。
また、出力と入力が同一項目名の場合は、画面右上の[自動マップ]ボタンを押下すると、勝手にout側にin側のリンクを行ってくれます。大変便利です。
とりあえず、tMapの設定が終わり、tLogRowまで配置&Row接続ができたら、ジョブ実行してみましょう。
今回のテストデータをそのまま流した場合は、7レコード出力されると思います。上記の通り出力されていれば、とりあえずokです。
これで一旦、ファイル入力⇒tMap(処理なし)⇒ログ出力のフローまで確認ができました。
tMapでマスタデータ紐づけを行う
今回は、ここからが本番です!
次に、新たな入力ファイルを読み込みましょう。突合するためのマスタデータcsvですね。
新たにtFileInputDelimitedコンポーネントを配置します。
そして、下記の通り設定を行います。
品目マスタデータのcsvを、[ファイル名/ストリーム]に指定し、後は画面の通り、csvに関するオプションを設定します。
設定が完了したら、tMapにRow接続します。この時、Rowの下にLookupと出ると思いますが、それで正しいです。
また、tFIleInputDelimitedのスキーマは仕様の通り、ITEM_CD, ITEM_NAMEを項目として追加しておきます。
今度は、tMapの設定を行います。
先ほどと異なり、左側の入力に、row2が追加されていることが確認できます。
ただ、このままですと、row1とrow2には一切関係を示すキーが記載されていません。
この状態のまま、一度ジョブを走らせてみると、想定と全く異なる結果が得られます。
row1からは7レコード、row2からは5レコードの入力がtMapに接続されていますね。
ここまでは想定通りです。
が、tMapからの出力はなんと…35レコードです。
えっ!なにこれ!
はい。データベースを学んだことがある方なら、ピンとくると思います。
SQLで、複数テーブルからジョインして結果のレコードを得る時に、キーを指定しないと、テーブル1のレコード数*テーブル2のレコード数分の結果が得られてしまうと思います。
まさに、TalendのtMap内でも同じことが起きてしまっていて、結果が35レコード(7*5レコード)となってしまいました。
トランザクションデータとマスタデータを紐づけるキーの設定
というわけで、tMap内でジョイン時のキーを設定します。
今回、仕様にもある通り、品目コードから品名を引いてくる、ということなので、row1とrow2を品目コードで紐づけます。
紐づけの仕方は、tMapのエディタ内で、Lookupに指定されていたRow接続側の[式キー]に、どの項目と紐づけるかを式で記述します。
今回の場合は、row2の[式キー]に、row1.ITEM_CDと書きます。
row1とrow2の品目コードで紐づけを行いますからね。
動作確認
これで、tMapの編集は完了です。
この状態で実行すると、先ほどとは違って、結果が7レコード、ITEM_NAMEを意味する項目に、品目マスタcsvから品目コードに紐づく名称がセットされていることが確認できるはずです。
結果は想定通りですね。
まとめ
まとめると、
- tMapにて、複数の入力ソースの情報を(SQLのJOINみたく)紐づけることができる
という感じですね。
次回は、tMapのフィルタ機能を取り上げていきたいと思います。
次回記事はこちら⇒【Talend Open Studio 入門04】tMapのフィルタリング機能とVarの使い方