hive_hiveql

HiveQL : 쿼리

  • image

    • 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

    • image

      • https://sqlrelease.com/sort-by-order-by-distribute-by-and-cluster-by-in-hive

    • ν•˜μ΄λΈŒλŠ” ORDER BY λŒ€μ‹  데이터λ₯Ό 각 λ¦¬λ“€μ„œμ— μ •λ ¬ν•˜λŠ” SORT BYλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. 각 λ¦¬λ“€μŠ€μ˜ 좜λ ₯이 μ •λ ¬λ˜λ„λ‘ μ§€μ—­ μ •λ ¬(local ordering)을 μˆ˜ν–‰ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

  • SORT BY와 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” DISTRIBUTE BY

    • image

      • 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

    • image

      • 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