본문 바로가기
IT, Software/DataBase

Hive SQL - 두개의 테이블을 Select한 결과끼리 Join하기

by 기타마을이장 2022. 8. 6.

 

코딩 업무가 주업이었던 상황에서 벗어난 지 꽤 된 데다 애초부터 앱 개발이 주 커리어여서인지...

누가 보면 이런 기본적인걸 아직도 몰랐단 말이냐...라고 비웃을지도 모르겠지만ㅠ

그래도 이제라도 잊지 말자고 틈틈이 연습하고 공부한 내용들을 저장해둔다.

 

이번엔 Hive SQL에서 Select한 두 개의 결과들을 함께 Join 하는 방법을 찾아본다.

내가 이해한 내용으로 말로 풀어본다면...

  1. 2개의 테이블에서 원하는 결과를 우선 쿼리한다.
    단 2개의 테이블을 Join할 수 있는 공통 Column은 존재해야 함
  2. 2개의 테이블을 각각 "as" 명령으로 지정해준다.
  3. 마지막으로 2개의 테이블을 Join 한 것을 from 에 두고 최종 쿼리를 완성한다.

 

Select후에 Join을 하게 된 이유

굳이 이렇게 복잡하게 먼저 테이블들을 Select 한 다음에 Join을 할 필요는 없을 수도 있다.

하지만, 지금 진행 중인 프로젝트의 경우 하나의 테이블에 기록되는 데이터의 양이

하루에만 데이터가 최소 몇십만 단위로 쌓이고 한 달이면 천만 단위의 데이터다.

그런 테이블을 다른 기초정보 테이블이랑 그냥 Join을 걸어버리면 안 그래도 Hadoop이 Join성능이 좋지 않다는데;;;

그래서 대량의 데이터가 저장된 테이블에서 Group By를 먼저 걸어서 Join이 발생되는 Row 수를 줄이는 게 목적이다.

(실제로 무분별한 Join으로 문제를 발생시켜본 적이나 trouble shooting을 해본 적이 많지는 않지만

다년간의 다양한 프로젝트 PM을 하다 보니 간접경험 혹은 주워들은 정보가 참 많긴 하다. 괜히 부끄럽;;;;)

 

date name no drink_id snack_id
20220801 bob 1 180 150
20220801 jack 2 175 110
20220801 john 3 181 130
20220802 bob 1 181 150
20220802 jack 2 180 130
.... .... .... .... ....

<테이블 1 - snack_bar> 직원들이 스낵바에서 구매한 구매이력을 모아둔 테이블(대량)

 

date drink_id drink_name
20210801 180 사이다
20211002 175 콜라
20210921 181 환타
.... .... ....

<테이블 2 - drink> 음료수 정보를 관리하는 테이블

 

2개의 테이블을 Select 한 뒤에 Join 걸어주기

단순 Join 하기

그냥 단순히 조인하는 방법은 비교적 간단하다.

select A.date, A.name, B.drink_name 
from snack_bar A left join drink B on A.drink_id = B.drink_id
where A.date = '20220801'
group by A.name;

 

Select 먼저 하고 Join 하기

위의 2개의 테이블 중에서 snack_bar 테이블이 대량 데이터가 보관 중인 테이블이다.

그래서 먼저 해당 테이블에서 group by를 먼저 해서 Join대상 Row 수를 줄인 다음 Join을 해준다.

select a1.base_date, a1.ch_no, a1.submat_id, a2.submat_nm, a2.submat_len_cd, a1.dur, a1.cnt
from
(select date, name, drink_id from snack_bar
where date = '20220801'
group by name) A
left join 
(select drink_id, drink_name from drink) B
on A.drink_id = B.drink_id;

 

대량 테이블에 그냥 Join 걸어서 하면 얼마나 심각한 부하가 발생되나 하는 걸

이번에 구축한 서버에서테스트해보고 싶은 마음이 아주 잠깐 들었지만 다시는 그런 생각을 하지 않기로 했다ㅎㅎ

그냥 안전하게 먼저 group by 하고 나서 Join을 하는 걸로....ㅠ

반응형

댓글