Talendをとりあえず使いこなすために調べたこと

#対象とする人
チュートリアルや、ブログ等でTalendをある程度さわってみた人

Talendとは何か、Talendで何ができるのか、Talendのインストール方法は？　といった内容は他の方におまかせします。
参考：[Talendに爆速で入門する](https://qiita.com/hidepy/items/909e1fd689fa9937ae28)

本文では、次のステップとしてTalendをある程度使いこなすために調べたことをまとめます。

Talendには様々な製品がありますが、本文でTalendと言った場合、Talend Open Studio for Data Integrationを指しています。

#Talendを実行した環境
Windows7 64bit
Talend 7
Java1.8

#プロジェクトとは
ビジネスモデル図、ジョブ、コンポーネント、コードなど、色々なタイプのアイテムが、Talendにはあります。これらのアイテムを格納する最上位に、プロジェクトが位置します。
よって、Talendを使用するには、まずプロジェクトを作成またはインポートする必要があります。

#ビジネスモデル図とは
ビジネスモデル図は、業務のニーズをグラフィカルに表現できます。
ビジネスモデル図は、Talendのジョブを実行する上で必須ではありません。ただし、仕様や業務プロセスなどを他人に理解させる（または未来の自分に思い出させる）のに役に立つかもしれません。
![ビジネスモデル図.PNG](https://qiita-image-store.s3.amazonaws.com/0/120078/454f8310-6975-eb78-8f3c-8a9c6fee407b.png)

#ジョブとは
１つ以上のサブジョブで構成されています。
ジョブはエクスポートできます。
エクスポートした結果は、javaがインストールされている環境で実行することができます。
タスクスケジューラーに設定して定期的な実行ができるようになります。

#サブジョブとは
１つ以上のコンポーネントで構成されています。コンポーネント同士を繋げる（接続する）と、サブジョブを形成します。
サブジョブ同士を相互に接続し、データの流れを設計します。青白い枠が、サブジョブを表しています。
以下の図は、サブジョブ同士を接続している様子です（「OnSubJobOk」でトリガー接続している）。
![サブジョブ１.PNG](https://qiita-image-store.s3.amazonaws.com/0/120078/2fa6c467-ba45-f5ea-fdcd-884b2a272c92.png 
)


サブジョブ同士を接続せずに実行すると、各サブジョブは順番に実行されます。
以下の図は、サブジョブ同士を接続していない様子です。
ジョブの実行結果が、サブジョブの実行順番に依存する場合は、サブジョブ同士を接続したほうがよさそうです。
![サブジョブ２.PNG](https://qiita-image-store.s3.amazonaws.com/0/120078/78dea843-985d-3651-ae9e-316d8af5afd5.png)

#コンポーネントとは
Talendでは、多くの機能がパーツとして提供されています。そのパーツがコンポーネント。
コンポーネントを組み合わせて、様々な処理を行うことができます。
コンポーネントは相互に接続できます。接続されたコンポーネントは、サブジョブを形成します。

#コンポーネントの接続タイプ
コンポーネント同士の接続には様々なタイプがあります。
コンポーネントを右クリックすると、選択したコンポーネントで使用できる接続がリスト表示されます。
接続タイプは大きくわけて３つあります。

 - Row（行）接続
 - Iterate（反復）接続
 - Trigger（トリガー）接続

##Row(行)接続
Row接続では実際のデータが処理されます。
例えば、
読み込んだデータベースのテーブルの１行ごと
読み込んだエクセルの１行ごと

Row接続には、処理するデータの性質に基づいて、Main (メイン)、Lookup (ルックアップ)、Reject (リジェクト)、Output (出力)、Uniques/Duplicates (ユニーク値/重複値)、Combine があります。

##Iterate（反復）接続
反復接続は、その名の通りループを実行するために使用します。
例えば、
ディレクトリにある全てのファイルに対して、処理を行いたい場合

Iterate(反復)接続のターゲットにできるのは1つのコンポーネントに限られます。
Iterate(反復)接続は主に、サブジョブの開始コンポーネントに接続します。

##Trigger（トリガー）接続
トリガー接続によって、サブジョブやコンポーネントに依存性が作成され、トリガーの性質に基づいて順次実行されます。

 - サブジョブトリガー
    - サブジョブがOKの場合（サブジョブ内で一度もExceptionが発生しない場合）
    - サブジョブがエラーの場合（サブジョブ内でExceptionが発生した場合）
    - Run if（javaでif文を記述でき、結果のTrue・Falseで分岐）
 - コンポーネントトリガー
    - コンポーネントがOKの場合（Exceptionが発生しない場合）
    - コンポーネントがエラーの場合（Exceptionが発生した場合）
    - Run if（javaでif文を記述でき、結果のTrue・Falseで分岐）

####サブジョブがエラー、コンポーネントがエラーっていつ発生するの？
Talendによって生成されたJavaコードを見たところ、何かしらのExceptionが発生した場合に実行されるようになっていました。
つまり、入力用に指定したファイルが見つからない時や、出力用のファイルを開いたままのために保存できなかった時、などに実行されます。
例えば、「OK」「NG」ボタンがあるtMsgBox（メッセージボックス）コンポーネントで、「NG」ボタンを押したとしても、Exceptionが発生するわけでないので、コンポーネントOKのルートが実行されます。

##Row(行)接続の種類
###Row　→　Main（メイン）
ETLツールにおいて、最も一般的に使用されるタイプの接続方法だと思います。
コンポーネントからコンポーネントにデータを渡し、各行でデータを処理します。
※注
Row→Main接続を使って、２つのコンポーネントを１つのコンポーネントに接続できません。
Row→Main接続は、１つのコンポーネントにつき１つのみ。
２番目のRow接続はLookup（ルックアップ）と呼ばれます。
SQL文でいうと、from句に書くのがMainで、left join句に書くのがLookup　といったイメージ。

###Row　→　Lookup（ルックアップ）
このRow(行)接続により、Main接続しているコンポーネントに対し、複数の入力を受け取れるようになります。

###Row　→　Filter（フィルター）
tFilterRowやtFilterColumnコンポーネントでフィルターをかけた時、フィルタリング条件に一致するデータが収集されます。

###Row　→　Rejects（リジェクト）
tFilterRowやtFilterColumnコンポーネントでフィルターをかけた時、フィルタリング条件に一致しないデータが収集されます。または、予想された出力では無効となるデータが収集されます。
例えば、型が不正、null値が定義されていない、などで処理できなかったデータを追跡できます。

###Row　→　ErrorRejects（エラーリジェクト）
tMapコンポーネントの処理中にエラー（入力ファイルが存在しないなど）が発生した場合、デフォルトでは強制終了しますが、
map editorの「err on die」チェックボックスをOffにすると、ErrorRejects出力を収集できるようになるようです。
ただし、私が試した環境ではErrorRejectsの出力ができなかった。
[エラー処理](https://help.talend.com/reader/QfepFiIJO_6eLiY1WN~6mQ/yg0wvAb6jVwJyWmMm_BF7Q)
いずれ、調査して追記したいと思います。

###Row　→　Output（出力）
tMapコンポーネントの出力を収集します。

###Row　→　Uniques/Duplicates (ユニーク値/重複値)
tUniqRowコンポーネントの出力が収集されます。
プロパティのユニークキーで設定されたキーを元に、最初に検出された行を収集するのが、Uniques。
プロパティのユニークキーで設定されたキーを元に、最初に検出された行の重複値がある行を収集するのが、Duplicates。

##Trigger
###SubJobOK（サブジョブがＯＫの場合）
サブジョブがエラーなしで完了した場合に次のサブジョブを起動するために使用されます。この接続は、ジョブの開始コンポーネントでのみ使用します。

###SubJobError（サブジョブがエラーの場合）
サブジョブが正しく完了しなかった場合に次のサブジョブを起動トリガーするために使用します。

###ComponentOK（コンポーネントがＯＫの場合）
コンポーネントの実行がエラーなしで完了した場合、次のコンポーネントが起動されます。

###ComponentError（コンポーネントがエラーの場合）
コンポーネントの実行でエラーが発生した場合、次のコンポーネントが起動されます。

###Run-If（条件付き実行）
定義した条件が満たされた場合にサブジョブまたはコンポーネントを起動します。