ソースはこちら。
https://github.com/kuinaein/talend-complex-merge-example
やりたいこと
ETLツールTalend Open Studio for Data Integration 7.2.1を使っている。
データベース(テーブル)AとBがある。それぞれカラムとしてID、名称、メールアドレスetcを保持している。Aには連携用にB側のIDも入っているが、連携前の場合は0。
さて、データベースAからBへの一方向同期を行いたい。B側のIDが分かっている場合は当然にそれを使う。分かっていない場合は、まずメールアドレスが一致するもの、次に名称が一致するものを連携対象のレコードとし、そのIDを使う。
元のデータは例えばこんな感じ。
A
id | name | b_org_id | |
---|---|---|---|
1 | 麻布株式会社 | azabu@nowhere.com | 0 |
2 | 株式会社伊藤工務店 | itou@nowhere.com | 10002 |
3 | (株)宇治園芸店 | uji@nowhere.com | 10003 |
4 | 衛門府 | emon@nowhere.gov | 0 |
5 | オスマンエージェンシー(株) | osman@nowhere.com | 0 |
B
org_id | name | |
---|---|---|
10001 | 麻布株式会社 | azabu@nowhere.com |
10002 | 株式会社伊藤工務店 | itou@nowhere.com |
10003 | 株式会社宇治園芸店 | uji@nowhere.com |
10004 | 衛門府 | dayomon@nowhere.gov |
10004 | 衛門府 | demonen@nowhere.gov |
10005 | 堀高高等学校 | holy@nowhere.edu |
(Bで10004が被っているのは誤記ではなくて、実際には「組織」「組織の担当者」と2つテーブルがあるのを簡略化のためにJOINしているから。)
ペインポイント
2つのテーブルを、結合条件を変えながら何度も結合しなおすというところが難点。
Talendでは循環参照を防ぐため、コンポーネント間の接続が結構制限される。
具体的に言うと、2つのコンポーネントについて、(たとえ間にtReplicate等を挟もうと)その2つから伸びている接続線を2回以上交わらせることができない模様。
同じファイルを何度も読みこませたり、tMapでCROSS JOINしてtFilterRowで自力で絞り込むという荒業もできなくはないが。。
tHashInput/tHashOutputを使う
Talendにはテーブルデータをメモリに保存して何度も再利用できるtHashInput/tHashOutputというコンポーネントがあるのでそれを使う。
ただし、デフォルトでは有効になっていないので、ファイルメニューの「プロジェクトプロパティの編集」で設定を変える必要がある。デザイナー>パレット設定を開き、右ペインのジョブ>テクニカル下にある両コンポーネントを有効化する。
tHashOutputで保存したデータを、tHashInputから読み込ませる形になる。tHashInputはどのtHashOutputのデータを読み出すか選択できるもの、スキーマを同期してはくれない。リポジトリでスキーマを定義してしまうことを推奨。
(かなり雑だが、、)出力はこんな感じになる。
2 | 株式会社伊藤工務店 | itou@nowhere.com | 10002 | |
3 | (株)宇治園芸店 | uji@nowhere.com | 10003 | |
rejected | 5 | オスマンエージェンシー(株) | ||
by_email | 1 | 10001 | ||
by_name | 4 | 10004 |