여타 ETL 툴과 같이 talend에서도 lookup 사용이 가능하다
component는 Processing폴더에 Map 을 이용.
사용법은 처음연결하는 flow가 master가 되고 이후 연결되는 flow는 lookup이 됨
기본적인 연결이나 사용은 우선 패스하고 lookup 부분에 대해서 설명하면
1) Match Model
: Unique match, First match : 하나만 선택하는데 Unique match는 last match, first match는 이름그래도 first match.
: All matches : lookup 되는 테이블과 매핑되는 row가 여러 row일때 모두 join.
2) Join Model
: Left outer Join
: Innter Join --> DB에서의 left outer join, inner join 과 동일한 의미. left outer join에서는 mapping key 가 없어도 master는 출력.
non equi join
non equi join 의 경우 join model 이 inner join일때 만 가능할 듯 하고 아직 방법은 못찾았음.
inner join일때 lookup 에서 Expression filter 에 filter 조건을 기술하면 non equi join 이 가능하다
http://bekwam.blogspot.kr/2012/07/theta-join-with-talend-open-studio.html
여기를 참조해도 될듯하며, left outer join에 non equi join의 경우 다음과 같은 이유로 현재는 구현이 어려움. 계속 찾아는 보긴하겠지만.
Match Model과 Join Model을 여러가지로 바꿔가며 테스트해보았습니다.
기본적인 구조는 다음과 같구요.
InputFile들 포멧 및 내용은 아래와 같습니다.
파일명 | tFileInputDelimited_2 | tFileInputDelimited_3 | |
컬럼명 | id;name;value | id;value | |
값 | 1;A;100 | 1;100 | |
2;B;150 | 1;200 | ||
3;C;300 | 1;300 |
Map_1에서의 mapping은 다음과 같습니다.
위의 Match Model, Join Model, Expression Filter 를 바꿔가며 테스트한 결과입니다.
원하는결과 | |
1;A;100;1;100 | |
2;B;150;null;null | |
3;C;300;null;null | |
조건 | all match&inner join&filter없음 |
결과 | 1;A;100;1;100 |
1;A;100;1;200 | |
1;A;100;1;300 | |
조건 | all match&inner join&filter(row4.value == row3.value) |
결과 | 1;A;100;1;100 |
조건 | all match&left join&filter없음 |
결과 | 1;A;100;1;100 |
1;A;100;1;100 | |
1;A;100;1;100 | |
2;B;150;null;null | |
3;C;300;null;null | |
조건 | all match&left join&filter(row4.value == row3.value) |
결과 | 1;A;100;1;100 |
1;A;100;null;null | |
1;A;100;null;null | |
2;B;150;null;null | |
3;C;300;null;null |
위와 같이 원하는 left outer join에 non-equi join을 적용한 결과는 나오지 않습니다. 우선 left outer join , all match를 하면 expression filter를 적용해도 row가 filter되지는 않는듯 합니다. 원하는건 DB에서 left outer join에서 on 에 들어가는 조건처럼 expression filter가 역할을 하기를 바랬으나 좀더 나중에 적용되는것 같습니다.
그래서 당장은 lookup table을 select할때 where 조건을 주어 원하는 결과를 얻기를 했지만 이는 where절 조건이 정해진 경우이고 main table에 컬럼에 따라 동적으로 non-equi join이 필요하게 되면 다른방법을 찾아야 할 듯 합니다.
추가로 join을 두번하는 비효율을 무릅쓰고 아래와 같은 구성도 시도해 보았으나 Map_1 에서 Map_3로 연결자체가 안됨. ㅜ
다른방법을 찾으면 이 문서에 추가하도록 하겠습니다.