Hive 查詢語法大集合

SELECT … FROM Clauses


  1. hive> SELECT name, salary FROM employees;  


表別名

  1. hive> SELECT   name,   salary FROM employees;  
  2. hive> SELECT e.name, e.salary FROM employees e;  


Specify Columns with Regular Expressions


  1. hive> SELECT symbol, `price.*` FROM stocks;  
  2. AAPL    195.69  197.88  194.0   194.12  194.12  
  3. AAPL    192.63  196.0   190.85  195.46  195.46  
  4. AAPL    196.73  198.37  191.57  192.05  192.05  
  5. AAPL    195.17  200.2   194.42  199.23  199.23  
  6. AAPL    195.91  196.32  193.38  195.86  195.86  

Computing with Column Values

  1. hive> SELECT upper(name), salary, deductions["Federal Taxes"],  
  2.     > round(salary * (1 - deductions["Federal Taxes"])) FROM employees;  
  3.   
  4. JOHN DOE    100000.0  0.2   80000  
  5. MARY SMITH   80000.0  0.2   64000  
  6. TODD JONES   70000.0  0.15  59500  
  7. BILL KING    60000.0  0.15  51000  

Arithmetic Operators --算數運算



Mathematical functions






Aggregate functions -- 集合函數





  1. hive> SET hive.map.aggr=true;  
  2. hive> SELECT count(*), avg(salary) FROM employees;  

Table generating functions 


  1. hive> SELECT explode(subordinates) AS sub FROM employees;  
  2. Mary Smith  
  3. Todd Jones  
  4. Bill King  



Other built-in functions




LIMIT Clause --限制行數


  1. hive> SELECT upper(name), salary, deductions["Federal Taxes"],  
  2.     > round(salary * (1 - deductions["Federal Taxes"])) FROM employees  
  3.     > LIMIT 2;  
  4. JOHN DOE    100000.0  0.2   80000  
  5. MARY SMITH   80000.0  0.2   64000  

Column Aliases --列別名


  1. hive> SELECT upper(name), salary, deductions["Federal Taxes"as fed_taxes,  
  2.     > round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes  
  3.     > FROM employees LIMIT 2;  
  4. JOHN DOE    100000.0  0.2   80000  
  5. MARY SMITH   80000.0  0.2   64000  


Nested SELECT Statements --子查詢


  1. hive> FROM (  
  2.     >   SELECT upper(name), salary, deductions["Federal Taxes"as fed_taxes,  
  3.     >   round(salary * (1 - deductions["Federal Taxes"])) as salary_minus_fed_taxes  
  4.     >   FROM employees  
  5.     > ) e  
  6.     > SELECT e.name, e.salary_minus_fed_taxes  
  7.     > WHERE e.salary_minus_fed_taxes > 70000;  
  8. JOHN DOE    100000.0  0.2   80000  

CASE … WHEN … THEN Statements --case 關鍵字


  1. hive> SELECT name, salary,  
  2.     >   CASE  
  3.     >     WHEN salary <  50000.0 THEN 'low'  
  4.     >     WHEN salary >= 50000.0 AND salary <  70000.0 THEN 'middle'  
  5.     >     WHEN salary >= 70000.0 AND salary < 100000.0 THEN 'high'  
  6.     >     ELSE 'very high'  
  7.     >   END AS bracket FROM employees;  
  8. John Doe         100000.0   very high  
  9. Mary Smith        80000.0   high  
  10. Todd Jones        70000.0   high  
  11. Bill King         60000.0   middle  
  12. Boss Man         200000.0   very high  
  13. Fred Finance     150000.0   very high  
  14. Stacy Accountant  60000.0   middle  

WHERE Clauses -- 篩選


  1. SELECT * FROM employees  
  2. WHERE country = 'US' AND state = 'CA';  

  1. hive> SELECT name, salary, deductions["Federal Taxes"],  
  2.     >   salary * (1 - deductions["Federal Taxes"])  
  3.     > FROM employees  
  4.     > WHERE round(salary * (1 - deductions["Federal Taxes"])) > 70000;  
  5. John Doe    100000.0  0.2   80000.0  

  1. hive>  SELECT name, salary, deductions["Federal Taxes"],  
  2.     >    salary * (1 - deductions["Federal Taxes"]) as salary_minus_fed_taxes  
  3.     >  FROM employees  
  4.     >  WHERE round(salary_minus_fed_taxes) > 70000;  
  5. FAILED: Error in semantic analysis: Line 4:13 Invalid table alias or  
  6. column reference 'salary_minus_fed_taxes': (possible column names are:  
  7. name, salary, subordinates, deductions, address)  

  1. hive> SELECT e.* FROM  
  2.     > (SELECT name, salary, deductions["Federal Taxes"as ded,  
  3.     >    salary * (1 - deductions["Federal Taxes"]) as salary_minus_fed_taxes  
  4.     >  FROM employees) e  
  5.     > WHERE round(e.salary_minus_fed_taxes) > 70000;  
  6. John Doe        100000.0        0.2     80000.0  
  7. Boss Man        200000.0        0.3     140000.0  
  8. Fred Finance    150000.0        0.3     105000.0  


Predicate Operators 


LIKE and RLIKE


  1. hive> SELECT name, address.street FROM employees WHERE address.street LIKE '%Ave.';  
  2. John Doe        1 Michigan Ave.  
  3. Todd Jones      200 Chicago Ave.  
  4. hive> SELECT name, address.city FROM employees WHERE address.city LIKE 'O%';  
  5. Todd Jones      Oak Park  
  6. Bill King       Obscuria  
  7. hive> SELECT name, address.street FROM employees WHERE address.street LIKE '%Chi%';  
  8. Todd Jones      200 Chicago Ave.  

  1. hive> SELECT name, address.street  
  2.     > FROM employees WHERE address.street RLIKE '.*(Chicago|Ontario).*';  
  3. Mary Smith      100 Ontario St.  
  4. Todd Jones      200 Chicago Ave.  

  1. SELECT name, address FROM employees  
  2. WHERE address.street LIKE '%Chicago%' OR address.street LIKE '%Ontario%';  


GROUP BY Clauses


  1. hive> SELECT year(ymd), avg(price_close) FROM stocks  
  2.     > WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'  
  3.     > GROUP BY year(ymd);  
  4. 1984    25.578625440597534  
  5. 1985    20.193676221040867  
  6. 1986    32.46102808021274  
  7. 1987    53.88968399108163  
  8. 1988    41.540079275138766  
  9. 1989    41.65976212516664  
  10. 1990    37.56268799823263  
  11. 1991    52.49553383386182  
  12. 1992    54.80338610251119  
  13. 1993    41.02671956450572  
  14. 1994    34.0813495847914  

HAVING Clauses


  1. hive> SELECT year(ymd), avg(price_close) FROM stocks  
  2.     > WHERE exchange = 'NASDAQ' AND symbol = 'AAPL'  
  3.     > GROUP BY year(ymd)  
  4.         > HAVING avg(price_close) > 50.0;  
  5. 1987    53.88968399108163  
  6. 1991    52.49553383386182  
  7. 1992    54.80338610251119  
  8. 1999    57.77071460844979  
  9. 2000    71.74892876261757  
  10. 2005    52.401745992993554  

Inner JOIN

  1. hive> SELECT a.ymd, a.price_close, b.price_close  
  2.     > FROM stocks a JOIN stocks b ON a.ymd = b.ymd  
  3.     > WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM';  
  4. 2010-01-04      214.01  132.45  
  5. 2010-01-05      214.38  130.85  
  6. 2010-01-06      210.97  130.0  
  7. 2010-01-07      210.58  129.55  
  8. 2010-01-08      211.98  130.85  
  9. 2010-01-11      210.11  129.48  


Example 6-1. Query that will not work in Hive

  1. SELECT a.ymd, a.price_close, b.price_close  
  2. FROM stocks a JOIN stocks b  
  3. ON a.ymd <= b.ymd  
  4. WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM';  

LEFT OUTER JOIN


  1. hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend  
  2.     > FROM stocks s LEFT OUTER JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol  
  3.     > WHERE s.symbol = 'AAPL';  
  4. ...  
  5. 1987-05-01      AAPL    80.0    NULL  
  6. 1987-05-04      AAPL    79.75   NULL  
  7. 1987-05-05      AAPL    80.25   NULL  
  8. 1987-05-06      AAPL    80.0    NULL  
  9. 1987-05-07      AAPL    80.25   NULL  
  10. 1987-05-08      AAPL    79.0    NULL  
  11. 1987-05-11      AAPL    77.0    0.015  
  12. 1987-05-12      AAPL    75.5    NULL  
  13. 1987-05-13      AAPL    78.5    NULL  
  14. 1987-05-14      AAPL    79.25   NULL  
  15. 1987-05-15      AAPL    78.25   NULL  
  16. 1987-05-18      AAPL    75.75   NULL  
  17. 1987-05-19      AAPL    73.25   NULL  
  18. 1987-05-20      AAPL    74.5    NULL  
  19. ...  

OUTER JOIN Gotcha


  1. hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend  
  2.     > FROM stocks s LEFT OUTER JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol  
  3.     > WHERE s.symbol = 'AAPL'  
  4.     > AND s.exchange = 'NASDAQ' AND d.exchange = 'NASDAQ';  
  5. 1987-05-11      AAPL    77.0    0.015  
  6. 1987-08-10      AAPL    48.25   0.015  
  7. 1987-11-17      AAPL    35.0    0.02  
  8. 1988-02-12      AAPL    41.0    0.02  
  9. 1988-05-16      AAPL    41.25   0.02  
  10. ...  

  1. hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend FROM  
  2.     > (SELECT * FROM stocks WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') s  
  3.     > LEFT OUTER JOIN  
  4.     > (SELECT * FROM dividends WHERE symbol = 'AAPL' AND exchange = 'NASDAQ') d  
  5.     > ON s.ymd = d.ymd;  
  6. ...  
  7. 1988-02-10      AAPL    41.0    NULL  
  8. 1988-02-11      AAPL    40.63   NULL  
  9. 1988-02-12      AAPL    41.0    0.02  
  10. 1988-02-16      AAPL    41.25   NULL  
  11. 1988-02-17      AAPL    41.88   NULL  

RIGHT OUTER JOIN


  1. hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend  
  2.     > FROM dividends d RIGHT OUTER JOIN stocks s ON d.ymd = s.ymd AND d.symbol = s.symbol  
  3.     > WHERE s.symbol = 'AAPL';  
  4. ...  
  5. 1987-05-07      AAPL    80.25   NULL  
  6. 1987-05-08      AAPL    79.0    NULL  
  7. 1987-05-11      AAPL    77.0    0.015  
  8. 1987-05-12      AAPL    75.5    NULL  
  9. 1987-05-13      AAPL    78.5    NULL  


FULL OUTER JOIN


  1. hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend  
  2.     > FROM dividends d FULL OUTER JOIN stocks s ON d.ymd = s.ymd AND d.symbol = s.symbol  
  3.     > WHERE s.symbol = 'AAPL';  
  4. ...  
  5. 1987-05-07      AAPL    80.25   NULL  
  6. 1987-05-08      AAPL    79.0    NULL  
  7. 1987-05-11      AAPL    77.0    0.015  
  8. 1987-05-12      AAPL    75.5    NULL  
  9. 1987-05-13      AAPL    78.5    NULL  
  10. ...  


LEFT SEMI-JOIN


Example 6-2. Query that will not work in Hive

  1. SELECT s.ymd, s.symbol, s.price_close FROM stocks s  
  2. WHERE s.ymd, s.symbol IN  
  3. (SELECT d.ymd, d.symbol FROM dividends d);  

Instead, you use the following LEFT SEMI JOIN syntax:

  1. hive> SELECT s.ymd, s.symbol, s.price_close  
  2.     > FROM stocks s LEFT SEMI JOIN dividends d ON s.ymd = d.ymd AND s.symbol = d.symbol;  
  3. ...  
  4. 1962-11-05      IBM     361.5  
  5. 1962-08-07      IBM     373.25  
  6. 1962-05-08      IBM     459.5  
  7. 1962-02-06      IBM     551.5  

ORDER BY and SORT BY


Here is an example using ORDER BY:

  1. SELECT s.ymd, s.symbol, s.price_close  
  2. FROM stocks s  
  3. ORDER BY s.ymd ASC, s.symbol DESC;  

Here is the same example using SORT BY instead:

  1. SELECT s.ymd, s.symbol, s.price_cl  
  2. FROM stocks s  
  3. SORT BY s.ymd ASC, s.symbol DESC;  

Casting

  1. SELECT name, salary FROM employees  
  2. WHERE cast(salary AS FLOAT) < 100000.0;  

Queries that Sample Data -- 抽樣


  1. hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;  
  2. 2  
  3. 4  
  4. hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;  
  5. 7  
  6. 10  
  7. hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON rand()) s;  

  1. hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON number) s;  
  2. 2  
  3. hive> SELECT * from numbers TABLESAMPLE(BUCKET 5 OUT OF 10 ON number) s;  
  4. 4  
  5. hive> SELECT * from numbers TABLESAMPLE(BUCKET 3 OUT OF 10 ON number) s;  
  6. 2  

  1. hive> SELECT * from numbers TABLESAMPLE(BUCKET 1 OUT OF 2 ON number) s;  
  2. 2  
  3. 4  
  4. 6  
  5. 8  
  6. 10  
  7. hive> SELECT * from numbers TABLESAMPLE(BUCKET 2 OUT OF 2 ON number) s;  
  8. 1  
  9. 3  
  10. 5  
  11. 7  
  12. 9  


UNION ALL


  1. SELECT log.ymd, log.level, log.message  
  2.   FROM (  
  3.     SELECT l1.ymd, l1.level,  
  4.       l1.message, 'Log1' AS source  
  5.     FROM log1 l1  
  6.   UNION ALL  
  7.     SELECT l2.ymd, l2.level,  
  8.       l2.message, 'Log2' AS source  
  9.     FROM log1 l2  
  10.   ) log  
  11. SORT BY log.ymd ASC;  

  1. FROM (  
  2.   FROM src SELECT src.key, src.value WHERE src.key < 100  
  3.   UNION ALL  
  4.   FROM src SELECT src.* WHERE src.key > 110  
  5. ) unioninput  
  6. INSERT OVERWRITE DIRECTORY '/tmp/union.out' SELECT unioninput.*  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章