Talend入門 (7)　～Context変数～

##全体の目的
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)

##今回の目的
Context変数ついて理解する。

##サンプルプログラム概要
パラメータとして2つの実行時引数を必要とするプログラムを作ってみます。

##Context変数とは
ジョブ内で扱うことのできる変数です。一般的な開発言語でいうところのグローバル変数という理解でＯＫです。

#### Context変数の定義
それではサンプルジョブを作成していきましょう。
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]に"context"と入力し[Finish]ボタンをクリックします。
![GS000048.png](https://qiita-image-store.s3.amazonaws.com/0/364565/4305b7de-2841-1095-9120-b2ddb3f2b8c1.png)

[Contexts(context)]タブを開き[+]ボタンを2回クリックします。
![GS000049.png](https://qiita-image-store.s3.amazonaws.com/0/364565/4dd335a7-c763-1d9c-d315-833f3f632583.png)

以下ように2つのContext変数を定義します。

| Name              | Comment | value |
|:-----------------|:------------------|:------------------|
| ctx_corp_no    | 法人番号  | A0001|
| ctx_date  | 処理日付 | 2019-03-24 |
![GS000050.png](https://qiita-image-store.s3.amazonaws.com/0/364565/c4589d8a-b314-4b40-675f-0dd34601d08f.png)

#### Context変数の呼び出し
デザインワークスペースに[tFixedFlowInput]と[tLogRow]を配置します。
[tFixedFlowInput]はContext変数の読み出しに利用、[tLogRow]は出力に利用します。
![GS000051.png](https://qiita-image-store.s3.amazonaws.com/0/364565/a9410fec-24d7-5378-ac70-da00353a6d97.png)

[tFixedFlowInput]のスキーマの編集画面を開き、2カラムを定義します。

|#| カラム              | 
|:--|:-----------------|
|1| corpno    |
|2| date  |

![GS000052.png](https://qiita-image-store.s3.amazonaws.com/0/364565/9d44be5a-93e5-8649-e818-6bfe81e15299.png)

このような状態です。モードは**シングルテーブルの使用**で設定します。
![GS000053.png](https://qiita-image-store.s3.amazonaws.com/0/364565/485a5e67-b8d5-1f9b-0e39-28b8beadf8f4.png)

次にcorpnoの値に**Context変数で定義した ctx_corp_no** を設定したいのですが、ここで下記のように con まで入力したところで **Ctrl + スペース** を入力します。
![GS000054.png](https://qiita-image-store.s3.amazonaws.com/0/364565/8c9c55aa-0c25-c94d-3bc2-9d189bac15b8.png)

するとこのように設定可能な候補を表示させることができます。
![GS000056b.png](https://qiita-image-store.s3.amazonaws.com/0/364565/c832b276-f8a4-f447-c629-ef8dd9347998.png)

Context変数で準備した値をそれぞれのカラムの値として設定します。

|Column|値|
|:--|:--|
|corpno|context.ctx_corp_no|
|date|context.ctx_date|

![GS000057.png](https://qiita-image-store.s3.amazonaws.com/0/364565/1e24b910-9a3c-f509-792a-257e3e7c85dd.png)

tLogRowとロウでつなぎます。
![GS000058.png](https://qiita-image-store.s3.amazonaws.com/0/364565/75aa1ca7-a9f0-7f45-e281-dc3ad0ee7dd3.png)

#### 実行
これで準備は完了です。実行してみましょう。
Context変数をジョブ内で利用できることが確認できました。
![GS000059c.png](https://qiita-image-store.s3.amazonaws.com/0/364565/66b93d8a-939b-07d4-c744-18e08efed2ea.png)

#### 実行時引数として値を渡す
実はContext変数として定義した値はそのまま実行時引数として使うことができます。

Talendとは切り離したJava VM上で実行するために先ほどのジョブをエクスポートします。
![GS000059d.png](https://qiita-image-store.s3.amazonaws.com/0/364565/eb37ba18-2730-89d5-fb4b-c51ba9888ded.png)

いつも通りです。
![GS000060.png](https://qiita-image-store.s3.amazonaws.com/0/364565/7ba3a52c-9260-a8cf-61f3-225820caf960.png)

エクスポートした context_0.1.zip を解凍するとこんな感じ。
![GS000061.png](https://qiita-image-store.s3.amazonaws.com/0/364565/6f50c851-59e4-bca0-0512-cf32c84050e7.png)

context_run.bat をコマンドプロンプトで実行します。
Talend上で実行したものと同じ結果が出力されます。
![GS000062a.png](https://qiita-image-store.s3.amazonaws.com/0/364565/16d7a8c5-088d-80a1-fd34-8c35265afff3.png)

最後に今回の本題となる実行時引数としてパラメータ(Context変数)を書き換えてみます。
以下のフォーマットでContext変数および値を指定します。
--context_param **定義したContext変数名**=設定したい値

- 2つとも書き換えるのでコマンドラインに以下を追加します。
    - --context_param **ctx_corp_no**=Z9991
    - --context_param **ctx_date**=2019-01-01

![GS000067.png](https://qiita-image-store.s3.amazonaws.com/0/364565/1615f8f4-949f-83df-138a-af85a89aec9a.png)

実行結果です。
出力結果が変わった（Context変数を上書きした）ことを確認できました。
![GS000068a.png](https://qiita-image-store.s3.amazonaws.com/0/364565/73c01bcc-303b-d223-db98-1fb6e47a85aa.png)

##まとめ
今回はContext変数について学びました。
ポイントは以下2点ですね。

- ジョブ内でグローバル変数として利用できる。
- 実行時引数として利用できる。

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

##次回以降
次回はGlobal Mapをやっていきます。