Talend入門 (9)　～tHashInput/tHashOutput～

##全体の目的
Talendの超簡単なサンプルジョブを作成して，ETLジョブ開発に必要なスキルを習得することが目的です。

##対象者
ETL / EAI技術者

##環境
|使用環境|バージョン|
|:----:|:------------------|
|OS|Windows10|
|Talend|7.1.1|	

##サンプル一覧
以下の順番で習得していきます

|#|内容|
|:----:|:------------------|
|1|[はじめてのTalend](https://qiita.com/airkoda/items/a837d3c5d851d98d2612)|
|2|[ファイルI/O](https://qiita.com/airkoda/items/1cd12c05c6136add7178)|
|3|[データベースI/O](https://qiita.com/airkoda/items/bc807c920c3adebad837)|
|4|[tMap](https://qiita.com/airkoda/items/fa4a9c022b5d688698e0)|
|5|[イテレータ](https://qiita.com/airkoda/items/404d2d65eff535b2126c)|
|6|[メタデータ](https://qiita.com/airkoda/items/4b42cf2a86f34abb6c87)|
|7|[Context変数](https://qiita.com/airkoda/items/42d294fca40b81aa20fb)|
|8|[Global Map](https://qiita.com/airkoda/items/1aba0d36905c755deeae)|
|**9**|**[tHashInput/tHashOutput（今回）](https://qiita.com/airkoda/items/d9347865190f0f3ab180)**|
|10|[エラーハンドリング](https://qiita.com/airkoda/items/85e7c49a9bf6a21db6d5)|
|11|[ロギング](https://qiita.com/y-fujioka-yoshiharu/items/e0280f34cff2e3d00bda)|
|12|[子ジョブ（ジョブのネスト）](https://qiita.com/y-fujioka-yoshiharu/items/04ea4bd74ded382cf03c)|
|13-1|[設定ファイル読み込みオリジナル版](https://qiita.com/airaotaku/items/92f114795108f25e6d0f)|
|13-2|[設定ファイル読み込みコンポ版](https://qiita.com/airyama/items/83c2bf9b2d51a79c3714)|
|14|[tJava](https://qiita.com/airkoda/items/4d81d76c36b6fcbd4d89)|

[サンプルコード（Talendプロジェクトデータ）](https://github.com/kd2air/qiita)

##今回の目的
tHashInput/tHashOutputについて理解する。

##tHashInput/tHashOutputとは
**ロウをメモリに保持**しておけるコンポーネントです。
何度も同じマスタをlookupする場合など、**「データベースI/OやディスクI/Oを一度で済ませロウを使いまわす」**といった設計の場合に力を発揮します。


- tHashOutput
    - ロウをメモリに保持する際に使います
- tHashInput
    - メモリに保存済みのロウを取得する際に使います


##サンプル作成
サンプルプログラムを動かしながら使い方を見ていきましょう。
以下サンプルを作成します。

- CSVファイルをロード
- tHashOutputを使いメモリにロウを保持
- メモリに保持しているロウをtHashInputで取得
- ログを出力


### 入力ソース準備
in.csvというファイルを作成します。
今回は C:\work\hashinput\in.csv に作成しました。

- エンコードはシフトJIS
- 改行コードはLF

```csv:in.csv
id,name,gender
1,kouda,男
2,mori,男
3,kubo,男
4,shimizu,男
5,aya,女
```

![GS000300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/356fb70f-76fb-f1ee-e8a5-8c95d00de961.png)

###ジョブの作成
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]に**hashinput**と入力し[Finish]ボタンをクリックします。

![GS000283.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2f720e60-dc67-d6a8-3377-0474b3ee6b26.png)

###tHashOutputとtHashInputを使えるようにする
デフォルト設定ではtHashInputとtHashOutputが使えません。
PaletteFilterボタンをクリックします。
![GS000284.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/e4e5947a-1061-57cd-37c5-68cbf844270a.png)

パレットの設定画面で Hide - テクニカルの中にtHashInputとtHashOutputがあることを確認します。
確認できたら右矢印をクリックします。
![GS000277.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/ec602707-1c66-882e-0a0a-f26ad4b55776.png)

Show側に登録できたらOKボタンをクリックします。これでパレットから呼びだすことができるようになります。
![GS000278.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/29a66ece-0cfa-f0bf-d99b-a0ca93c547fa.png)


###tHashOutputとtHashInputの配置

[tFileInputDelimited]と[tHashOutput]を配置しロウでつなぎます。
![GS000288.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/208a0e99-88f9-38e1-f905-7ab7862b6830.png)

[tFileInputDelimited]の[基本設定]を以下のように設定します。

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| ファイル名    | C:/work/hashinput/in.csv  | 読み込みファイルのパス|
| フィールド区切り  | , | 入力データに合わせてカンマを指定 |
| ヘッダー  | 1 | 1行目はヘッダとして扱う |

[tFileInputDelimited]の[詳細設定]でエンコーディングを指定します。

| 項目名              | 設定内容 |    説明  |
|:-----------------|:------------------|:------------------|
| エンコーディング    | CUSTOMでSJIS  | 入力ファイルのエンコーディングに合わせる|

スキーマ編集ダイアログを開きカラム名とタイプを以下のように設定します。

| 列      | カラム |  タイプ |
|:-----------------|:------------------|:------------------|
| 1列目    | id  | int|
| 2列目    | name  | String|
| 3列目    | gender  | String|

![GS000033.png](https://qiita-image-store.s3.amazonaws.com/0/364565/c2ad76f0-766d-cf5a-c51a-0c6e432b5ce5.png)

[tHashInput]と[tLogRow]を配置しロウでつなぎます。
さらに[tFileInputDelimited]で右クリックしサブジョブOKで[tHashInput]につなぎます。
![GS000289.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/2d7950e9-2a40-29cd-017a-c9af6b67294c.png)

ここで一度実行してみましょう。
何も出力されません。。。でもこれで準備はできました。次に進みましょう。
![GS000290.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b2c88a0e-585c-2255-2fe3-59876390394a.png)

###tHashOutputとtHashInputのひもづけ

[tHashOutput]の[基本設定]を開きスキーマの編集ボタンをクリックします。
![GS000291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/8a4742c4-2464-2539-f110-7e890966a557.png)

XMLファイルにエクスポートするボタンをクリックします。
![GS000292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/cde1ce5f-949b-5041-74cf-d0e25be82faf.png)

スキーマ定義.xml という名称で保存しましょう。
![GS000293.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/f65d8bda-a079-ce70-903e-abffaf9770ab.png)

保存されました。(explorerで確認)
![GS000295.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/c37a341e-1e11-8fc4-159c-7a892d4be732.png)

[tHashInput]の[基本設定]を開きスキーマの編集ボタンをクリックします。
![GS000296.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/b689c31b-9b43-c973-a518-f423ed8899f7.png)

インポートボタンをクリックし、先ほど保存したスキーマ定義.xmlを指定します。
![GS000297.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/a754b846-56c8-f943-6d48-e6dc497ba3ff.png)
![GS000298.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/35585785-72b6-d059-987c-d1b3f0c4d98f.png)

それでは再度実行してみましょう。
メモリに保持しているロウ(tHashInput)の内容を出力できました。
![GS000299.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/af17da9f-156d-70e3-4797-84d1a35ce734.png)

##まとめ
今回はtHashInputとtHashOutputコンポーネントの使い方を紹介しました。
メモリリソースに余裕があればロウの使いまわしができるこのコンポーネントは使いどころが多いのでぜひ試してみてください。

あらたに利用したコンポーネントと用途をおさらいしておきます。

- tHashOutput
    - ロウをメモリに保持
- tHashInput
    - メモリに保存済みのロウを取得

毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

##次回以降
次回はエラー処理をやっていきます。