유니온 최적화
유니온 최적화 (Union Optimization)
UNION ALL 뒤에 select *와 파일 싱크가 오는 패턴에서는, 중간 임시 파일에 결과를 썼다가 다시 읽어 최종 디렉토리에 쓰는 비효율이 발생할 수 있어요. Hive의 유니온 최적화는 유니온의 하위 쿼리들이 직접 최종 디렉토리에 쓰도록 바꿔 이 불필요한 읽기·쓰기를 없애준답니다.
출처: 문서
본문
다음 쿼리를 생각해 보세요.
select * from
(subq1
UNION ALL
sub2) u;
유니온의 부모들이 map-reduce 잡이라면 결과를 임시 파일에 쓰게 돼요. 그러면 유니온이 이 임시 파일에서 행을 읽어 최종 디렉토리에 쓰게 돼요. 결과적으로 결과가 불필요하게 두 번 읽고 쓰이게 되죠. 최종 디렉토리에 직접 씀으로써 이를 피할 수 있어요.
설계 (Design)
다음 조건이 성립하면 최적화가 적용돼요:
- 유니온 뒤에
select *가 이어지고, 그다음 파일 싱크(file sink)가 옵니다. - 유니온의 모든 부모가 파일 싱크입니다.
유니온은 2개보다 많은 부모를 가질 수 있어요.
최종 파일 싱크의 출력 디렉토리가 dir_final이라고 해 봐요. 그러면 subq1과 subq2의 출력 디렉토리를 각각 dir_final/subquery_1, dir_final/subquery_2로 바꿔요. gatherStats 같은 최종 파일 싱크의 다른 모든 속성도 함께 복사돼요. 그 후 유니온과 그 아래에 있는 모든 것을 제거해요.
이 최적화는 Skewed Join Optimization에 중요하지만, 다른 경우에도 유용하게 쓰여요.
더 알아보기 (Learn more)
- Hive 쿼리 최적화에 대한 더 많은 내용은 Hive 문서에서 확인할 수 있어요.