2017-11-10 8 views
0

그 결과에 레코드가없는하이브 SQL 여러 왼쪽 외부 조인 쿼리는 내가 7 개 테이블을 조인 아래에 내가 쿼리를 사용하고이 작업을 수행하기 위해, 하나 개의 큰 조인 된 테이블에 조인 된 데이터를 삽입하려고

INSERT OVERWRITE TABLE databaseName.joinTab PARTITION (tran_date) 
SELECT <180 cols across all 7 tables> 
FROM databaseName.table1 tab1 
LEFT OUTER JOIN databaseName.table2 tab2 ON (tab1.id = tab2.id and 
tab1.tran_date='20171030' and tab2.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table3 tab3 ON (tab1.id = tab3.id and 
tab1.tran_date='20171030' and tab3.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table4 tab4 ON (tab1.id = tab4.id and 
tab1.tran_date='20171030' and tab4.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table5 tab5 ON (tab1.id = tab5.id and 
tab1.tran_date='20171030' and tab5.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table6 tab6 ON (tab1.id = tab6.id and 
tab1.tran_date='20171030' and tab6.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table7 tab7 ON (tab1.id = tab7.id and 
tab1.tran_date='20171030' and tab7.tran_date='20171030') 
WHERE (tab1.tran_date='20171030'); 

tran_date는 이러한 모든 테이블의 파티션 열입니다. 왜냐하면 내가 ON 절에있는 조건뿐만 아니라 where 절을 가지고있는 이유는 tez 작업이 시작된 것이 table1에 대한 전체 테이블 스캔을 수행한다는 것을 알았 기 때문입니다. .

그래서 여기 내 문제는 내가 tran_date의 표에서 카운트 (*)를 할 경우 = 20171030 다음 난 결과로 11845917를 얻을 수있다

내가 (joinTab를) 새로운 조인 된 테이블에서 카운트 (*)를 할 경우 그 동일한 파티션에 대해 tran_date = 20171030 나는 매우 큰 차이가있는 결과 97609 만 얻었습니다. 왼쪽 외부 조인을 사용하기 때문에 테이블 1의 모든 데이터를 조인 테이블로 이동하고 널 (null)을 채워야한다고 생각했던 것입니다. 다른 테이블에. table1 데이터가로드 될 때 joinTab에서 tran_date를 언급해야합니다.

여기에 보이지 않는 것이 있습니까? 당신의 도움에 대한

감사

답변

0

당신이 재현 예제를 제공하지 않았기 때문에이 솔루션이 작동하는지 내가 테스트 할 수 있지만,이 같은 시도 할 수 있습니다 :

WITH tab1_temp AS (SELECT <tab1 cols> WHERE tab1.tran_date='20171030' 
) 
INSERT OVERWRITE TABLE databaseName.joinTab PARTITION (tran_date) 
SELECT <180 cols across all 7 tables> 
FROM tab1_temp 
LEFT OUTER JOIN databaseName.table2 tab2 ON (tab1.id = tab2.id and 
tab1.tran_date='20171030' and tab2.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table3 tab3 ON (tab1.id = tab3.id and 
tab1.tran_date='20171030' and tab3.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table4 tab4 ON (tab1.id = tab4.id and 
tab1.tran_date='20171030' and tab4.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table5 tab5 ON (tab1.id = tab5.id and 
tab1.tran_date='20171030' and tab5.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table6 tab6 ON (tab1.id = tab6.id and 
tab1.tran_date='20171030' and tab6.tran_date='20171030') 
LEFT OUTER JOIN databaseName.table7 tab7 ON (tab1.id = tab7.id and 
tab1.tran_date='20171030' and tab7.tran_date='20171030') 
;