Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인)
Hive Left Semi Join (세미 조인) 과 Cartesian Product Join (카테시안 프로덕트 조인)
· Version : Hive
Hive에서 Left Semi Join (왼쪽 세미 조인)은 오른쪽 테이블에서 ON 조건을 만족하는 레코드를 찾을 경우 왼쪽 테이블의 레코드를 반환한다.
일반적인 RDBMS의 SQL은 조건을 만족하기 위해 IN 또는 EXISTS 구문을 지원하지만, 하이브에서는 동작하지 않는다. 하이브는 기본적으로 Right Semi Join (오른쪽 세미 조인) 을 지원하지 않으며 SELECT 와 WHERE절에서 오른쪽 테이블의 컬럼을 참조 할 수 없음에 주의해야 한다. 아래 스크립트는 하이브에서 사용할 수 있는 Left Semi Join의 예시이다.
select a.col_1, a.col_2 from tbl_a as a left semi join tbl_b as b on a.col_1 = b.col_1 and a.col_2 = b.col_2 |
하이브에서 세미 조인이 일반 내부 조인보다 효율적인 이유는 왼쪽 테이의 한 레코드에 대해서 오른쪽 테이블에서 일치하는 레코드를 찾으면 더 이상 일치하는 레코드를 찾지 않고 바로 데이터를 반환하고 멈추기 때문이다.
카테시안 프로덕트 조인(Cartesian Product Join)은 조인의 왼쪽 테이블에 있는 튜플(tuple)과 오른쪽에 있는 튜플이 모든 쌍을 맺는다. 다른 조인 유형과 달리 하이브에서는 카테시안 프로덕트를 병렬로 실행하지 않는다. 또한 맵리듀스에서 최적화되어 있지도 않다. 아래 스크립트는 하이브에서 전체 카테시안 프로덕트(Full Cartesian Product)를 실행한다.
select a.*, b.* from tbl_a as a join tbl_b as b where a.col_1 = b.col_1 |
일반적인 RDBMS에서는 위와 같은 쿼리에 대해서 내부 조인에 최적화되어 있으나, 하이브에서 이런 종류의 쿼리는 WHERE 절을 적용하기 전에 전체 카테시안 프로덕트를 실행한다. 그래서 쿼리가 아주 오래 걸릴 수 있다. 사용자 부주의로 카테시안 프로덕트를 방지하기 위해 hive.mapred.mode 속성이 strict 로 되어 있으면 카테시안 프로덕트의 실행을 방지 할 수 있다.
2020-07-27 / Sungwook Kang / http://sungwookkang.com
Hadoop, Big Data, 하둡, 빅데이터, 데이터분석, HDFS, 하둡 파일 시스템, Hive, 하이브, 하이브쿼리, HiveSQL, JOIN, HIVE LEFT SEMI JOIN, 하이브 최적화, 하이브 튜닝, Hive Tuning, Hive Query Hint, CartesianProductJoin, 카테시안조인