Hive에서 제공하는 기능중에서 일반 SQL 에서는 볼 수 없는 기능들 중, 리듀서에 보내는 데이터를, 분류할 수 있는 아래 3가지에 대해 알아보도록 하자.
game_account
얼핏 order by 와 느낌이 비슷해 보인다. 하지만, order by 는 Map-Reduce가 끝난 뒤 최종적으로 모인 하나의 리듀서에서 정렬을 하기때문에 정확히 정렬된 결과를 받을 수 있다.
select *
from game_account
order by id limit 9;
Sort by는 최종 데이터가 모이기 전, 각 리듀서 내에서 정렬하는 역할을 한다. 때문에 sort by가 적용되면 각 리듀스 내 데이터끼리 정렬하게 된다.
2개의 리듀서 사용해 예시를 보자.
set mapred.reduce.tasks=2;
select *
from game_account
sort by id;
리듀서 별로 정렬된 데이터가 그대로 붙어서 결과로 나왔다. 정렬된 데이터로 사용할 수 없다.
그런데, 만약 리듀서 갯수를 설정을 통해 강제로 1개로 만들고 sort by를 진행하면 어떻게 될까?
set mapred.reduce.tasks=1
결과는 order by와 동일하다 😲
특징: 데이터를 저장시에 파일별로 데이터를 정렬시킬 수 있다.
장점: 리듀서의 수가 많아서, order by보다 속도가 빠르다.
단점: 최종 데이터가 정렬되지 않아 정렬용도로 사용이 불가능, select 시에는 용도가 불분명🤔
column의 값을 기준으로 distribute by 를 reducer별로 같은값이 들어가게 된다.
Distribute by는 group by 로 상상하여 접근하면 쉽다.
map 상태에서 리듀서로 데이터가 넘어갈때, 같은 column값인 데이터들끼리 묶어서 같은 reducer로 보내게 된다. (그림처럼)
만약, 한국사람들만을 모아두고 distribute by 국가 로 분류하게 되면 최종적으로 하나의 reducer 에 데이터가 몰리게 되고 저장시 하나의 큰 파일만 생성된다.
select *
from game_account
distribute by Role
특징:
장점:
단점:
기능의 예외:
Cluster by 는 매우 쉽게정리할 수 있다.
Distribute by 와 sort by 를 둘다 사용하는 것이다.