hive_hiveql
HiveQL : ์ฟผ๋ฆฌ

https://cwiki.apache.org/confluence/display/hive/design
SELECT ... FROM ์
SQL์์ SELECT ํ๋ก์ ์ (projection) ์ฐ์ฐ์. FROM ์ ์ ๋ ์ฝ๋๋ฅผ ์ ํํ๊ธฐ ์ํด ํ์ํ ํ ์ด๋ธ. ๋ทฐ ๋๋ ์ค์ฒฉ ์ฟผ๋ฆฌ(nested query)๋ฅผ ์๋ณํฉ๋๋ค.
์ปฌ๋ ์ ๋ฐ์ดํฐํ์ ์ปฌ๋ผ์ ์ ํํ๋ฉด ํ์ด๋ธ๋ ์ถ๋ ฅ์ ์ํด JSON(Java Script Object Notation)๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
ARRAY ๋ฐ์ดํฐํ์ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ด [...]๋ก ๋๋ ค์ธ์ฌ ์์ต๋๋ค.
MAP์ ๊ฒฝ์ฐ ์ผํ๋ก ๊ตฌ๋ถ๋ ํค:๊ฐ ์์ ๋ชฉ๋ก์ {...}๋ก ๋๋ฌ์ธ๋ JSON ํํ์ ์ฌ์ฉํฉ๋๋ค.
STRUCT๋ก JSON ๋งต ํ์์ ์ฌ์ฉํฉ๋๋ค.
ํ์ด๋ธ๋ ์ค๋ฒ ํ๋ก์ฐ๋ ์ธ๋ํ๋ก์ฐ๊ฐ ๋ฐ์ํ ๋ ๋ ๋์ ๋ฒ์์ ๋ฐ์ดํฐํ์ด ์กด์ฌํ๋๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ๋ณํํ์ง ์๋ ์๋ฐ ๋ฐ์ดํฐํ ๊ท์น์ ๋ฐ๋ฆ๋๋ค.
๊ธฐํ ๋ด์ฅ ํจ์
parse_url(url,partname,key) : HOST, PATH, QUERY, REF,PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:. ์ต์ ํค๋ ๋ง์ง๋ง์ QUERY:๋ฅผ ์์ฒญํจ
find_in_set(s, ์ผํ๋ก ๊ตฌ๋ถ๋ String) : ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด์์ s์ ์์ธ์ ๋ฐํํจ. ์ฐพ์ง ๋ชปํ๋ฉด NULL์ด ๋ฐํ๋จ
locate(substr,str,pos) : str์ post ์์น๋ก๋ถํฐ substr์ด ์๋ ์์ธ์ ๋ฐํํจ
instr(str,substr) : str์์ substr์ ์์ธ์ ๋ฐํํจ
str_to_map(s,delim1,delim2) : delim1์ ํค-๊ฐ ์์ ๊ตฌ๋ถ์๋ก ์ฌ์ฉํ๊ณ delim2๋ฅผ ํค์ ๊ฐ์ ๊ตฌ๋ถ์๋ก ์ฌ์ฉํ์ฌ ๋ฌธ์์ด s๋ฅผ ํ์ฑํ ํ ๋งต์ ์์ฑํจ
sentences(s,lang,locale) : ๋ฌธ์์ด s๋ฅผ ๋จ์ด์ ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์ฅ์ ๋ฐฐ์ด๋ก ๋ฐํํจ
ngrams(array<array>, N, K, pf) : ํ ์คํธ์์ top-K n-gram์ ๋ฐํํจ. pf๋ ์ ๋ฐ๋
context_ngrams(array<array>,array, int K, int pf> : ngrams์ ๊ฐ์ง๋ง ์ถ๋ ฅ ๋ฐฐ์ด์์ ๋ ๋ฒ์งธ ๋จ์ด ๋ฐฐ์ด๋ก ์์ํ๋ n-gram์ ์ฐพ์
in_file(s, filename) : filenmae ํ์ผ์์ ๋ฌธ์์ด s๊ฐ ๋ํ๋๋ฉด true๋ฅผ ๋ฐํํจ
WHERE ์
WHERE ์ ์์ ์ปฌ๋ผ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ฒฉ SELECT ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
SELECT e.* FROM (SELECT name, salary, deductions['Federal Taxes"] as ded, salary * (1 - deductions['Federal Taxes"]) as salary_minus_fed_taxes FROM employees) e WHERE round(e.salary_minus_fed_taxes) > 70000;LIKE์ RLIKE
ํ์ด๋ธ๋ LIKE ์ ์ ์๋ฐ ์ ๊ทํํ์์ ์ฌ์ฉํ ์ ์๋ RLIKE์ ๋ก ํ์ฅํฉ๋๋ค.
๋ง์นจํ(.)๋ ์ด๋ ํ ๋ฌธ์์ ์ผ์นํ๊ณ ๋ณ(*)์ ์ผ์ชฝ์ ์๋ ๊ฒ์ด 0๋ฒ์์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
(x|y) ํํ์์ x ํน์ y๊ฐ ์ผ์นํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์กฐ์ธ ๋ฌธ
ํ์ด๋ธ๋ ๊ณ ์ ์ ์ธ SQL ์กฐ์ธ ๋ฌธ์ ์ ๊ณตํ๋ฉฐ ๋๋ฑ ์กฐ์ธ(EQUAL-JOIN)๋ง ์ ๊ณตํฉ๋๋ค.
์กฐ์ธ ์ต์ ํ
ํ์ด๋ธ๋ ์ฟผ๋ฆฌ์ ๋ง์ง๋ง ํ ์ด๋ธ์ด ๊ฐ์ฅ ํฌ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฒํผ๋งํ๋ ค๊ณ ์๋ํ๊ณ ๊ฐ ๋ ์ฝ๋์ ๋ํด์ ์กฐ์ธ์ ์ํํ๋ฉด์ ๋ง์ง๋ง ํ ์ด๋ธ์ ํ๋ ค๋ณด๋ ๋๋ค. ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ๋๋ ๊ฐ์ฅ ํฐ ํ ์ด๋ธ์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ์ค๋๋ก ํฉ๋๋ค.
ํ์ด๋ธ๋ ์ฟผ๋ฆฌ ์ต์ ํ(optimizer)์ด๊ธฐ์ ์ด๋ค ํ ์ด๋ธ์ ๋ง์ง๋ง์ผ๋ก ํ๋ ค๋ณด๋ด์ผ ํ๋์ง ์ง์ ํ๋ ํํธ(hint) ๋ฉ์นด๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
SELECT /** STREAMTABLE(s) */ s.ymd, s.symbol, s.price_close, d.dividend FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol WHERE s.symbol = 'AAPL';
์ค์ฒฉ SELECT ๋ฌธ
SELECT s.ymd, s.symbol, s.price_close, d.dividend FROM (SELECT * FROM stocks WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') s LEFT OUTER JOIN (SELECT * FROM dividends WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') d ON s.ymd = d.ymd;
์ค์ฒฉ SELECT ๋ฌธ์ ๋ฐ์ดํฐ ์กฐ์ธ ์ ์ ํํฐ์ ํํฐ๋ฅผ ์ ์ฉํ๋ ๋ฐ ํ์ํ ํธ์๋ค์ด(push down)์ ์ํํฉ๋๋ค.
ํธ์๋ค์ด์ WHERE ์ ์ ์ ์ด ์ค ์ผ๋ถ๋ฅผ ๋ผ์ด๋ด์ด ๋ฏธ๋ฆฌ ์คํํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋ฆฌ์ง์ฃผ์ผ(residual)์ ํธ์๋ค์ด ํ์ ๋จ์ ์ ์ด๋ฅผ ์ผ์ปซ์ต๋๋ค.
ํ์ด๋ธ๋ ์กฐ์ธ์ ์ํํ ํ์ WHERE ์ ์ ํ๊ฐํฉ๋๋ค. WHERE ์ ์ NULL์ด ๋์ง ์๋ ์ปฌ๋ผ๊ฐ์ ๋ํด์๋ง ํํฐ๋ฅผ ์ ์ฉํ๋ ์ ์ด๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ํ์ด๋ธ ๋ฌธ์์๋ ๋ฌ๋ฆฌ ํํฐ์ ํํฐ๋ ์ธ๋ถ ์กฐ์ธ์ ON ์ ์์ ๋์ํ์ง ์์ต๋๋ค.
์ผ์ชฝ ์ธ๋ฏธ ์กฐ์ธ
์ผ์ชฝ ์ธ๋ฏธ ์กฐ์ธ(LEFT SEMI-JOIN)์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์์ ON์ ์ ์ด๋ฅผ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ฅผ ์ฐพ์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ ์ด๋ธ์ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ฉฐ ํ์ด๋ธ๋ ์ค๋ฅธ์ชฝ ์ธ๋ฏธ ์กฐ์ธ์ ์ง์ํ์ง ์์ต๋๋ค.
๋งต ์ฌ์ด๋ ์กฐ์ธ(Map-side Join)
๋ง์ฝ ํ ํ ์ด๋ธ๋ง ๋นผ๊ณ ๋ชจ๋ ์๋ค๋ฉด ์์ ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํ๊ณ ๊ฐ์ฅ ํฐ ํ ์ด๋ธ์ ๋งตํผ๋ก ํ๋ ค๋ณด๋ผ ์ ์์ต๋๋ค. ํ์ด๋ธ๋ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํ ์์ ํ ์ด๋ธ๋ก๋ถํฐ ์ผ์นํ๋ ๋ชจ๋ ๊ฒ์ ์ฐพ์ ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋งต์์ ๋ชจ๋ ์กฐ์ธ์ ํ ์ ์์. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ฐ ์กฐ์ธ ์๋๋ฆฌ์ค์์ ํ์ํ ๋ฆฌ๋์ค ๋จ๊ณ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
SELECT /*+ MAPJOIN(d) */ s.ymd, s.symbol, s.price_close, d.dividend FROM stocks s JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol WHERE s.symbol = 'AAPL'ํ์ด๋ธ๋ ์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ๊ณผ ์์ ์ธ๋ถ ์กฐ์ธ์ ๋ํด์ ์ต์ ํ๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
ORDER BY์ SORT BY

https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive
ํ์ด๋ธ๋ ORDER BY ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ ๋ฆฌ๋์์ ์ ๋ ฌํ๋ SORT BY๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ฐ ๋ฆฌ๋์ค์ ์ถ๋ ฅ์ด ์ ๋ ฌ๋๋๋ก ์ง์ญ ์ ๋ ฌ(local ordering)์ ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
SORT BY์ ํจ๊ป ์ฌ์ฉํ๋ DISTRIBUTE BY

https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive
DISTRIBUTE BY๋ ๋งต์ ์ถ๋ ฅ์ ๋ฆฌ๋์๋ก ์ด๋ป๊ฒ ๋๋์ด ๋ณด๋ด๋์ง๋ฅผ ์ ์ดํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋งต๋ฆฌ๋์ค๋ ๋งตํผ๊ฐ ์ถ๋ ฅํ๋ ํค์ ๋ํด์ ํด์๊ฐ์ ๊ณ์ฐํ๊ณ ํด์๊ฐ์ ์ด์ฉํ์ฌ ํค-๊ฐ ์์ ๊ฐ์ฉํ ๋ฆฌ๋์๋ก ๊ท ๋ฑํ๊ฒ ๋ถ์ฐํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
๋งตํผ์์ ์ถ๋ ฅํ ํค-๊ฐ ์์ ๊ฐ์ ๊ณ์ฐํ์ฌ ๋ฆฌ๋์๋ฅผ ์ ํํ๋ ๊ฒ์ ํํฐ์ ๋์ ์ญํ
SORT BY๋ ๋ฆฌ๋์ ์์์ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ ์ดํ๋ ๋ฐ๋ฉด DISTRIBUTE BY๋ ๋ฆฌ๋์๊ฐ ์ฒ๋ฆฌํ ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋์ง ์ ์ดํ๋ค๋ ์ ์์ GROUP BY์ฒ๋ผ ๋์ํฉ๋๋ค.
ํ์ด๋ธ๋ SORT BY ์ ์ ์ DISTRIBUTE BY ์ ์ ์ฌ์ฉํ ๊ฒ์ ์๊ตฌํ๋ฏ๋ก ์ฃผ์ํด์ผํฉ๋๋ค.
SORT BY ์ ์ ์ฌ๋ฌ ๋ฆฌ๋์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ๋ฐ๋ฉด ORDER BY ์ ์ ๋จ์ผ ๋ฆฌ๋์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ๋ ฌํด์ผ ํ ๋ ORDER BY ๋์ SORT BY๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ ์์ ์ ๋ ฅ์ ๋ํด ORDER BY๋ฅผ ์ฌ์ฉํ๋ฉด ์คํํ๋ ๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
CLUSTER BY

https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive
DISTRIBUTE BY ... SORT BY ๋๋ ๊ฐ๋จํ ์ฌ์ฉํ๋ CLUSTER BY ์ ์ ์ถ๋ ฅ ํ์ผ ๊ฐ์ ์ ์ฒด ์ ๋ ฌ์ ์ด๋ฃจ๋ฉด์ SORT BY์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๋ฐฉ๋ฒ
๋ฐ์ดํฐ ํ๋ณธ์ ๋ง๋๋ ์ฟผ๋ฆฌ
๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ ์ ๋ํด์ ์ ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ์ฌ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ํ ํ๋ณธ์ผ๋ก ํ์ฌ ์์ ํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค.
ํ์ด๋ธ๋ ํ ์ด๋ธ์ ๋ฒํท์ผ๋ก ๊ตฌ์ฑํ์ฌ ํ๋ณธ์ ๋ง๋ ๋ ์ฟผ๋ฆฌ๋ก ์ด๋ฅผ ์ง์ํฉ๋๋ค.
๋ฒํท ํ ์ด๋ธ์ ๋ํ ์ ๋ ฅ ํธ๋ฃจ๋
pruning(ํธ๋ฃจ๋)์ ๋ฐ์ดํฐ ๋ถ์ ์์ ์ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์๋ผ๋ด๋ ์์ ์ ๋งํฉ๋๋ค. ๊ฐ์ง์น๊ธฐ, ์ถ๋ฆฌ๊ธฐ ์ ๋๋ก ๋ฒ์ญํ ์ ์์ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ๋ถ์์ ๋ง์ด ์ฌ์ฉํ๋ ์ฉ์ด์ ๋๋ค.
Reference
https://www.amazon.com/Programming-Hive-Warehouse-Language-Hadoop/dp/1449319335
https://www.amazon.com/Hadoop-Definitive-Guide-Tom-White/dp/1449311520
Last updated