[Hive] HiveQL : 중첩 SELECT문, LIKE, CASE WHEN THEN ELSE END, GROUP BY, HAVING, ORDER BY, SORT BY, DISTRIBUTE BY
Hive 2016. 6. 26. 22:30이번 포스팅에서는 HiveQL의
- (1) 중첩 SELECT 문
- (2) LIKE
: substring 문자열 일치 여부 확인
- (3) CASE ... WHEN ... THEN ... ELSE ... END
: 범주형 변수 생성
- (4) GROUP BY, HAVING 절
: 집계 (aggregation), 그룹 내 조건절(HAVING)
- (5) ORDER BY
: 전체 정렬 (total ordering)
- (6) SORT BY, DISTRIBUTE BY
: 부분 정렬 (local ordering)
에 대해서 알아보겠습니다.
--------------------------------
-- HiveQL : 중첩 SELECT 문
--------------------------------
FROM (
SELECT var_1, var_2, (var_1*var_2) AS var_1_2_multi
FROM my_table
) a
SELECT a.var_1, a.var_2
WHERE a.var_1_2_multi > 100
LIMIT 10; -- 반환하는 행 상한치 10개로 제한
---------------------------------------------------
-- HiveQL : LIKE
---------------------------------------------------
-- substring 문자열 일치 여부 확인
SELECT var_1, var_2, var_3
FROM my_table
WHERE var_2 LIKE '%CC'; -- var_2에서 'CC'로 끝나는 문자열이 들어있는 row 선택
SELECT var_1, var_2, var_3
FROM my_table
WHERE var_2 LIKE 'AA%'; -- var_2에서 'AA'로 시작하는 문자열이 들어있는 row 선택
SELECT var_1, var_2, var_3
FROM my_table
WHERE var_2 LIKE '%BB%'; -- var_2에서 'BB'를 포함하는 문자열이 들어있는 row 선택
--------------------------------------------------------------
-- HiveQL : CASE ... WHEN ... THEN ... ELSE ... END
--------------------------------------------------------------
-- 범주형 변수 생성
SELECT var_1, var_2,
CASE
WHEN var_3 < 100.0 THEN 'L'
WHEN var_3 >= 100 AND var_3 < 1000 THEN 'M'
ELSE 'H'
END AS var_3_cd
FROM my_table;
-----------------------------------------
-- HiveQL : GROUP BY, HAVING
-----------------------------------------
-- 집계 (aggregation), 그룹 내 조건절(HAVING)
SELECT prd_cd, max(prd_price) AS prd_max_price
FROM prd_tr
WHERE prd_cd = 'ABC'
GROUP BY prd_cd -- aggregation by group
HAVING max(prd_price) >= 10000; -- GROUP BY에 의해 생성된 그룹에 대한 SUBQUERY
---------------------------------------------------------
-- HiveQL : ORDER BY
---------------------------------------------------------
-- => 쿼리 결과 집합에 대한 전체 정렬(TOTAL ORDERING), 오랜 시간 소요
SELECT prd_cd, prd_id, sum(prd_rev) AS prd_rev_sum
FROM prd_tr
WHERE prd_cd IN ('ABC', 'DEF', 'GHI')
GROUP BY prd_cd, prd_id
ORDER BY prd_cd ASC, prd_id DESC; -- total ordering, ASC 오름차순, DESC 내림차순
---------------------------------------------------
-- HiveQL : SORT BY, DISTRIBUTE BY
---------------------------------------------------
-- => 각 REDUCER에서 데이터 정렬(LOCAL ORDERING), 상대적으로 빠름
SELECT a.prd_cd, a.prd_id, sum(a.prd_price) AS prd_rev_sum
FROM prd_tr a
WHERE prd_cd IN ('ABC', 'DEF', 'GHI')
DISTRIBUTE BY a.prd_cd -- 같은 prd_cd 를 가진 데이터를 같은 reducer로 보냄
GROUP BY a.prd_cd, a.prd_id
SORT BY a.prd_cd ASC, a.prd_id DESC; -- local ordering
다음번 포스팅에서는 테이블 JOIN에 대해서 알아보겠습니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요.