【Talend】tMapの便利な機能あれこれ

## 概要
Talendのコンポーネントの中でも基礎中の基礎ともいうべき、「tMap」ですが、その機能は非常に多くイマイチ使い切れていない気がします。
なので「tMap」の機能についてあれこれまとめてみました。

因みに<font color="red"><b>全機能を使い倒すことを推奨しているわけではありません。</b></font>
便利だからといって何でもかんでもtMapを使うとどこで何の処理をしているかサッパリわからなくなります。

わからなくなりました:innocent:
　
##環境
|使用環境|バージョン|
|:----:|:------------------|
|OS|Windows10|
|Talend|7.1.1|	

## 実装
今回作成したジョブは以下となります。
アウトプットが3つある点についてはtMapの機能に応じてアウトプットを変えるためにそうしています。

■使用コンポーネント
・<font color="red"><b>tMap</b></font>
・tFileInputDelimited
・tLogRow
### ジョブ
![tMap_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/e49aac06-d23f-ace8-52ed-9f9c4f933099.png)

### テストデータ
```main.csv
ID,姓,名 <--header
1001,佐藤,太郎
1002,鈴木,春子
1003,高橋,次郎
1004,田中,夏子
1005,伊藤,三郎
1006,渡辺,秋子
1007,山本,四郎
1008,中村,冬子
1009,小林,五郎
1010,加藤,六郎
```

```lookup.csv
ID,役職 <--header
1001,マネージャー
1002,リーダー
1003,メンバー
1004,メンバー
1005,リーダー
1006,メンバー
1007,メンバー
1008,メンバー
1009,アルバイト
1011,メンバー
```

## 機能&#9312;　結合
mainとなるrow1の箱のkey項目をlookupとなるrow2のkey項目の青枠(式キー)にドラッグ&ドロップするだけで結合できます。
また、結合に関する設定はlookup側の箱の上部のスパナマークをクリックして表示される赤枠で囲まれた箇所で設定できます。
![tMap_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/d028d262-6188-893f-8a32-227ace19380b.png)

■結合に関する設定

<table>
    <th>Property</th><th>Value</th><th>内容</th>
    <tr><td rowspan="4">Match Model</td><td>Unique Match</td><td>デフォルトの設定。<br>結合できる対象が複数行あった場合、最後に結合できた1行を結合行として採用して出力する。</td></tr>
    <tr><td>First Match</td><td>結合できる対象が複数行あった場合、最初に結合できた1行を結合行として採用して出力する。</td></tr>
    <tr><td>All Matches</td><td>結合できる対象が複数行あった場合、すべてのパターン出力する。<br>※一般的なRDBの結合と同じ。</td></tr>
    <tr><td>すべての行</td><td>CROSS JOINを行う。<br>結合キーの設定は無視される。<br><br>
なぜ、Join Modelの設定じゃないんだろう。。。
</td></tr>
    <tr><td rowspan="2">Join Model</td><td>Left Outer Join</td><td>デフォルトの設定。<br>Left Outer Joinでの結合を指定。</td></tr>
    <tr><td>Inner Join</td><td>Inner Joinでの結合を指定。</td></tr>
</table>

## 機能&#9313;　入力フィルタ
入力データを処理前にフィルタリングできます。
tMapの前に配置された「<b>tFilterRow</b>」の処理をtMap内で解決できます。

赤枠の矢印マークをクリックすると表示されるテキスト入力ボックスに<b>booleanが返ってくるように</b>条件を設定。

例) IDのNULL排除
「row1.ID!=null」

![tMap_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/e7253868-04dc-237d-717c-382de52ffef8.png)

## 機能&#9314;　マッピング変数
赤枠の[Var] テーブル(変数テーブル)に登録することで処理結果の使いまわしができたり、1次処理をここに記載することで可読性を上げることができます。
![tMap_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/f2dd6a8c-a682-1537-fc95-31f41cb07abc.png)

## 機能&#9315;　出力フィルタ
出力データをフィルタリングできます。
tMapの後に配置された「<b>tFilterRow</b>」の処理をtMap内で解決できます。

赤枠の矢印マークをクリックすると表示されるテキスト入力ボックスに<b>booleanが返ってくるように</b>条件を設定。
![tMap_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/5c928bcd-af26-0100-cb02-3dbf5b40e770.png)

## 機能&#9316;　Catch output reject
### 設定方法
出力フィルタの条件を満たさないデータを出力できます。
想定外の値を持ったデータを本処理とは別に処理させることができます。

青枠のスパナマークをクリックすることで表示される赤枠の「<b>Catch output reject</b>」のValueを「True」にすることで設定。
![tMap_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/6f1d8790-4ff4-ccfa-b213-fb5ca578024f.png)

### 出力結果
役職がアルバイトとなるID=1009のレコードと
外部結合できずに役職がNULLとなるID=1010のレコードが
tLogRow_2(out2)の出力となる。

```
.----+-----+---------------.
|    tLogRow_1             |
|=---+---------+----------=|
|ID  |氏名     |役職        |
|=---+---------+----------=|
|1001|佐藤　太郎|マネージャー|
|1002|鈴木　春子|リーダー    |
|1003|高橋　次郎|メンバー    |
|1004|田中　夏子|メンバー    |
|1005|伊藤　三郎|リーダー    |
|1006|渡辺　秋子|メンバー    |
|1007|山本　四郎|メンバー    |
|1008|中村　冬子|メンバー    |
'----+-----+---------------'

.----+-----+-------------.
|   tLogRow_2            |
|=---+---------+--------=|
|ID  |氏名     |役職      |
|=---+---------+--------=|
|1009|小林　五郎|アルバイト|
|1010|加藤　六郎|null     |
'----+---------+---------'

.--+----+---.
|tLogRow_3  |
|=-+----+--=|
|ID|氏名|役職|
|=-+----+--=|
'--+----+---'
```


## 機能&#9317;　Catch lookup inner join reject
### 設定方法
内部結合時に結合できずに落ちたmainのデータを出力できます。
想定外の値を持ったデータを本処理とは別に処理させることができます。

青枠のスパナマークをクリックすることで表示される赤枠の「<b>Catch lookup inner join reject</b>」のValueを「True」にすることで設定。
※緑枠の設定のようにInner Joinで結合しないと出力されない。
※lookupのデータは出力できないので注意。
![tMap_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481986/f85b45dd-682e-6137-38f9-15299d169308.png)

### 出力結果
inner joinで結合できないID=1010のレコードがtLogRow_3(out3)の出力となる。
また、ID=1010のレコードがtLogRow_2(out2)に出力されていないことからわかるように
「<b>Catch lookup inner join reject</b>」で出力できたレコードは「<b>Catch output reject</b>」のみをTrueと設定しても出力されない。

```
.----+---------+-----------.
|    tLogRow_1             |
|=---+---------+----------=|
|ID  |氏名     |役職        |
|=---+---------+----------=|
|1001|佐藤　太郎|マネージャー|
|1002|鈴木　春子|リーダー    |
|1003|高橋　次郎|メンバー    |
|1004|田中　夏子|メンバー    |
|1005|伊藤　三郎|リーダー    |
|1006|渡辺　秋子|メンバー    |
|1007|山本　四郎|メンバー    |
|1008|中村　冬子|メンバー    |
'----+---------+-----------'

.----+---------+---------.
|   tLogRow_2            |
|=---+---------+--------=|
|ID  |氏名     |役職      |
|=---+---------+--------=|
|1009|小林　五郎|アルバイト|
'----+---------+---------'

.----+---------+----.
|  tLogRow_3        |
|=---+---------+---=|
|ID  |氏名     |役職 |
|=---+---------+---=|
|1010|加藤　六郎|null|
'----+---------+----'
```

## まとめ
tMapの便利な機能について、いくつか記載しました。

ただ、概要でも記載しましたが、便利だからと言ってなんでもかんでもtMapで実装すると
何をやっているかぱっと見ではさっぱりわからない可読性の悪いジョブとなってしまいます。

適切に使えば便利な機能が盛りだくさんなコンポーネントですので活用してみてください。