LoginSignup
0
1

More than 3 years have passed since last update.

Talendでちょっと複雑なリスト結合処理のためにtHashInputを使う

Last updated at Posted at 2019-09-27

ソースはこちら。
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 email 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 email
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回以上交わらせることができない模様。
image.png
同じファイルを何度も読みこませたり、tMapでCROSS JOINしてtFilterRowで自力で絞り込むという荒業もできなくはないが。。

tHashInput/tHashOutputを使う

Talendにはテーブルデータをメモリに保存して何度も再利用できるtHashInput/tHashOutputというコンポーネントがあるのでそれを使う。

ただし、デフォルトでは有効になっていないので、ファイルメニューの「プロジェクトプロパティの編集」で設定を変える必要がある。デザイナー>パレット設定を開き、右ペインのジョブ>テクニカル下にある両コンポーネントを有効化する。

tHashOutputで保存したデータを、tHashInputから読み込ませる形になる。tHashInputはどのtHashOutputのデータを読み出すか選択できるもの、スキーマを同期してはくれない。リポジトリでスキーマを定義してしまうことを推奨。
image.png

(かなり雑だが、、)出力はこんな感じになる。

2 株式会社伊藤工務店 itou@nowhere.com 10002
3 (株)宇治園芸店 uji@nowhere.com 10003
rejected 5 オスマンエージェンシー(株)
by_email 1 10001
by_name 4 10004
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1