【Talend Open Studio 入門04】tMapのフィルタリング機能とVarの使い方

行フィルタとVarについて

みなさん、こんにちは!

今回は、前回に引き続きtMapをさらに詳しく見ていこうと思います。
とても大事なコンポーネントですからね!

今回注目するtMapの機能は、行フィルタリングとtMapエディタの真ん中にあるVarです。
簡単に説明しますと、

  • 行フィルタリング
    • とある行の項目の値がxxのものだけ処理対象にする、のような絞込ができる
  • Var
    • 複雑な演算などを行う、又は、演算結果を複数回参照する場合などにtMap内で一時値を保存しておくために使用

こんな感じです。
この機能を実際の現場っぽい状態で使ってみましょう。

今回作るバッチジョブの要件かため

それでは、いつもの感じでやっていきます!
また山田さん(作り手)と支店長が会話をしています。

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

支店長
山田君!
山田
どうしました!?
支店長
この前は助かったよ。なんとか無事にデータ移行が完了したんだ。
山田
それは良かったです。
支店長
ところで、前回作ってもらったあのバッチジョブなんだが、さらに仕様を追加してもらいたいんだが…
山田
はい。どのような仕様でしょうか?
支店長
前回は、トランザクションデータの品目コードから、品目マスタデータの品名をくっつけたデータを作ってもらったが、今度は、トランザクションデータの単位を、単位換算マスタデータに当てて換算数量を取得して欲しいんだ。そして、換算数量*数量の結果を項目として出力してくれないか。
支店長
どうしてこんなことをするのかと言うと、どうやら、旧システムのデータは結構数量の入力ミスがあるようでな…明らかに数量が多すぎるデータを抽出して、管理者に教えてあげたいんだ。そのために単位換算マスタデータを使用して、数量変換が必要になるんだ。
支店長
なんとかお願いできないだろうか…
山田
はい。問題ありません。30分あれば十分です。
支店長
なんと頼もしいっ!!!!是非頼む!!!!

つまり、話をまとめると…

はい。こんな感じですね。
仕様をもう少し具体的に定めましょう。

  • 前回作成のバッチジョブに、さらに単位換算マスタの突合処理を追加する
    • 換算単位マスタは、TANI, KANSAN_SURYOの項目を持つとしましょう
  • 単位換算マスタの換算数量*トランザクションデータの数量を掛けた値が、明らかに多い(今回は30以上としましょう)場合は、入力ミス候補として表示したい
    • 入力ミス候補として出力する項目は、トランザクションデータのIDと換算数量*数量

単位換算マスタのサンプルデータ

単位換算マスタのサンプルデータを一応載せておきます。

【単位換算マスタcsv】

TANI,KANSAN_SURYO
"個",1
"ダース",12
"箱",10

CSVダウンロードはこちら⇒chapter02_tani

 

基本的には、前回のバッチジョブをベースに、数量換算処理と換算結果が30以上のものだけをフィルタリング(逆フィルタリング?)する処理を追加していきます。

実装

早速始めましょう!

前回作成したジョブ

前回までで作成したバッチはこんな感じでしたね。

1

トランザクションデータに、品目マスタデータを突き合わせて品目の名称を取得しています。

単位マスタを参照する

今度は、前回同様に単位換算マスタを当てます。

2

このあたりはもう初回からやってますから、飽きてきましたよね。
tFileDelimitedでファイル入力、後はcsvファイルを読み込むためのパラメータを設定します。スキーマの設定も忘れずに。
今回は、前述の通り2項目(TANI, KANSAN_SURYO)を設定して、一応KANSAN_SURYOの型はIntegerにしています。演算する予定なので。

3

 

設定が完了したら、tMapへRow接続します。
tMapは、複数のRow接続を持てますので、安心して繋いでください。もちろん、複数の出力も持てます。

tMapへ接続が完了したら、tMapの編集画面を開きます。

4

左の入力側が全部で3個になっていると思います。
このrow3の単位マスタの部分にも、トランザクションに紐づけるためのキーを記述しておきます。
今回は、トランザクションのTANNIと、単位換算マスタのTANNIを紐づけるので、式キーにその通り記述します。

Varを使う

さて!ここまでは前回の復習でしたが、ここからちょっと新しい話です。
皆さんずっと気になっていたであろう、真ん中のエリア、Varを使用しましょう。
といってももう触ったことあるよ!という方もいるかもしれませんが。

5

はい。このtMapエディタの真ん中部分ですね。
このVarというエリアは、最初にも書いた通り、複雑な計算を行う場合や、何度か計算結果を使いまわしたい場合に使用する、一時変数領域です。
実際のバッチ開発では、結構使うことになると思います。
もちろん、直接out1の式に長ーいJavaの文を書いても良いんですが…

今回は、このVarをトランザクションデータの数量*単位マスタの換算数量 の演算結果を保存する領域として使用しましょう。
この程度であればVarを使わなくてもいいんですけど、折角なんでね。はい。
使い方は簡単です。
Varエリアの右上の方にある緑の+マークを押せば新たな項目を追加し、(他の項目編集と同様ですね)
項目に参照用の名称を付けて、(変数 と書いてある項目)
タイプを設定して、(今回はint型)
式にJavaの式を書きます。(今回は、row1.SUURYO * row3.TANNI_KANSAN)6

Varの項目定義が終わったら、出力側の項目にこの結果を収める項目を作成し、Varの値をリンクします。
Varの項目の参照は、頭にVar.を付けてあげればokです。

これで一旦実行してみましょう。

7

問題がなければ、最初に実行した時の結果と比べて、末尾に数値項目が追加されているのが分かると思います。
個のデータは、換算数量が1なので、そのまま、ダースのものはx12されて、箱のものはx10された結果になっているはずです。

行フィルタリング

ここまでの結果が問題無ければ、当初の仕様通り、今度はtMapでフィルタを行い、この数値が30を超えているデータのみをさらに別に出力できるように修正をしていきます。
再びtMapエディタを開きます。

8

上記の通り、もう一つの出力グループを追加します。
右側の出力エリアで、赤枠の+を押して出力グループを追加します。今回はとりあえずOVER_QUANTITYなんて名付けてます。
次に、黄色枠部分で項目追加とタイプの設定を行い、緑枠部分でデータの紐づけを行います。
今作った出力グループを、数量が多すぎる打ち間違い候補を出力する側としましょう。
この出力グループは、VarのKANSAN_SUURYOの値が30以上のものだけこちら側に現れるようにフィルタリング(逆フィルタリング?)してあげる必要がありますね。

というわけで、フィルタ設定を行います!

9

今作ったOVER_QUANTITYの赤枠部のアイコン(⇒に+マークのやつ)をクリックします。
すると、上画像の通り式を入力するエリアが現れます。
ここに、フィルタリングの式を書くことでtMap内で行フィルタリングが行えます。
この式がtrueの場合のみ、行が出力されるというわけです。
今回は、仕様通り、求めたKANSAN_SUURYOの値が30以上のものだけを、打ち間違い候補として出力してほしい、ということなので、その通りに記述します。

動作確認

編集が終わったら、tMapを閉じてもう一度実行してみます。

10

IDと換算数量だけだとすごく結果が分かりにくかったので、こっそり1項目追加しています(【打ち間違いかも!!】と固定値を出す項目です)。
これを見ると、IDが0000000006と、0000000007のものに【打ち間違いかも!!】が表示されていますね。
確かに、この2レコードのみが換算後数量が30位以上になっています。

現実ですと、tLogRowで終わりじゃなくて、tFileoutputDelimitedなどでファイル出力するんでしょうが、ここでは面倒なので省略しました。
もう一つ現実的な話をしますと、今回のtMapで換算単位マスタと当てる時は、マスタ側にヒットしない可能性も考えてNULL判定などを入れた方がより安心ですね。こちらも面倒なので省略してしまいましたが。
後にご紹介する予定ですが、マスタにヒットしなかった場合にエラーレコードとして分類することも可能なので、それでハンドルしても良いでしょう。

まとめ

ということで、今回は前回に引き続き、tMapの機能を取り上げました。

  • 複雑な計算や、計算結果の使いまわしをする時はVar使った方が良い
  • tMap内で行のフィルタリングができる
    • 出力側にのみフィルタ処理を追加しましたが、もちろん入力側でフィルタも可能です

 

今回は以上です!

 

次の記事はこちら⇒【Talend Open Studio 入門05】データベース(SQLServer)を扱う。tMSSQLRowの使い方など

コメントを残す

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