Hive查詢語法

SELECT:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
] [
LIMIT number]
 

order   by   會對輸入做全局排序,因此只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。

sort by  不是全局排序,其在數據進入reducer前完成排序,因此,如果用sort  by進行排序,並且設置 mapred.reduce.task>1

則sort  by  只能保證每個reducer的輸出有序,不保證全局有序。

distribute   by(字段)   根據指定的字段將數據分到不同的reducer,且分發算法是hash散列。

cluster   by(字段) 除了具有distribute   by的功能外,還會對該字段進行排序、

因此,如果distribute和sort字段是同一個時,此時,cluster  by  =  distribute  by + sort  by 

查詢語法:

全表查詢:

select  *  from score;

選擇特定的列:

select s_id, c_id  from  score;

列別名:

重命名一個列,便於計算,緊跟列名,也可以在列名和別名直接加入關鍵字  AS

select   s_id , as  myid,  c_id from score;

常用函數:
 

求總行數:

select count(1)  from score;

求分數的最大值:

select  max(s_score)   from  score;

求分數的最小值:

select  min(s_score) from  score;

求分數的總和:
select  sum(s_score)  from score;

求分數的平均值:

select   avg(s_score)   from score;

Limit 語句:

select  * from score  limit3;

Where語句:

使用where子句,將不滿足條件的行過濾掉

where子句緊隨from子句

案例實操:

查詢出分數大於60的數據。

select  *   from  score  where  s_score  > 60;

比較運算符:

 

查詢分數等於80的所有的數據:

select * from  score  where s_score = 80;

查詢分數在80到100的所有數據:

select  * from score  where  s_score between  80  and 100;

查詢成績爲空的所有數據:
select  * from score where s_score is null;

查詢成績是80和90的數據:
select  * from  score   where  s_score  in (80,90);

Like  和  Rlike

使用LIKE運算選擇類似的值

選擇條件可以包含字符或數字

%  代表零個或多個字符(任意個字符)

_ 代表一個字符

RLike 子句是Hive中這個功能的一個擴展,其可以通過java的正則表達式這個更強大的語言來指定匹配條件。

案例實操:

查詢以8開頭的所有成績:

select  *  from  score  where  s_score  like  '8%';

查詢第二個數值爲9的所有成績數據:

select   *  from  score   where  s_score  like  '_9%';

查找s_id中含1的數據:

select  * from score  where s_id  rlike  '[1]';       #    like  '%1%';

邏輯運算符:

分組:

Group  By  語句:

Group  By   語句通常會和聚合函數一起使用,按照一個或者多個隊列結果進行分組,然後對每個組執行聚合操作。

計算每個學生的平均分數:

select  s_id,  avg(s_score)   from  score  group  by s_id;

計算每個學生的最高成績:

select s_id , max (s_score)  from  score  group  by  s_id;

HAVING語句:

 having  與where  不同點:

  1.          where  針對表中的列發揮作用,查詢數據;having針對查詢結果中的列發揮作用,篩選數據
  2.          where 後面不能寫分組函數,而having後面可以使用分組函數。
  3.           having只用於group   by  分組統計語句

 

 案例實操:

求每個學生的平均分數:

select  s_id ,  avg(s_score)  from   score  group   by  s_id;

求每個學生平均分數大於85 的人

select   s_id,  avg(s_score)   avgscore  from  score  group  by  s_id  having   avgscore > 85;

 

JOIN語句:

          等值JOIN

          hive支持通常的SQL JOIN  語句,但是隻支持等值連接,不支持非等值連接。

          案例操作:查詢分數對應的姓名:

select       s.s_id ,  s.s_score ,stu.s_name,stu.s_birth  from score s  join  student stu on  s.s_id = stu.s_id;

內連接:

      內連接:只有進行連接的兩個表中都存在於連接條件相匹配的數據纔會被保留下來。

select  *  from teacher   t   inner  join  course  c on t.t_id = c.t_id;

左外連接:

          左外連接: JOIN操作符左邊表符合where 子句的所有記錄將會被返回,查詢老師對應的課程

select   *   from  teacher  t    left   join   course  c  on  t.t_id  =  c.t_id;

右外連接:

          右外連接:  JOIN操作符右邊表中符合WHERE子句的所有記錄將會被返回。

select   *  from   teacher   t  right   join   course  c   on   t.t_id   = c.t_id;

多表連接:

              注意:  連接n個表,至少需要n-1  個連接條件。例如:連接三個表,至少需要兩個連接條件。

多表連接查詢。查詢老師對應的課程,以及對應的分數,對應的學生。

select   *   from  teacher  t  left  join  course  c  on   t.t_id  = c.t_id     left   join  score   s  on  s.c_id = c.c_id  

                 left  join  student   stu  on  s.s_id =  stu.s_id;

大多數情況下,Hive會對每對JOIN連接對象啓動一個MapReduce任務。本例中會首先啓動一個
MapReduce job對錶techer和表course進行連接操作,然後會再啓動一個MapReduce job將第一
個MapReduce job的輸出和表score;進行連接操作。
 

 

     排序:

           全局排序:   Order  by  全局排序 ,   一個reduce

  1.            使用ORDER   BY  子句 排序     ASC (ascend): 升序(默認)   DESC   (descend)  : 降序
  2.            ORDER  BY   子句 在SELECT  語句的結尾

查詢學生的成績,並按照分數降序排列

     select    *   from   student   s  left   join  score  sco  on   s.s_id  = sco.s_id  order   by  sco.s_score  DESC;

查詢學生的成績,並按照分數升序排列:

     select *  from  student  s   left  join  score  sco  on  s.s_id  = sco.s_id   order by  sco.score  asc;

 按照分數的平均值排序:

      select  s_id , avg(s_score)  avg   from  score group   by  s_id  order   by  avg;

多個列排序:

       select s_id ,avg(s_score) avg from score group by s_id order by s_id,avg;
每個MapReduce 內部排序   Score  By   局部 排序。

     Scort    By:  每個MapReduce  內部進行排序,對全局結果集來說不是排序

設置reduce 個數:

       set   mapreduce.job.reduces = 3;

1. 查看設置reduce 個數

      set  mapreduce.job.reduces;

1.查詢成績按照成績降序排列:

     select   *  from score  sort  by  s_score;

1.查詢結果導入到文件中(按照成績降序排列)

  insert   overwrite   local  directory   '/export/servers/hivedatas/sort'  select  *  from score sort  by  s_score;

分區排序(DISTRIBUTE   BY):

  Distribute  By: 類似MR 中partition ,進行分區,結合sort  by  使用;

注意,Hive  要求DISTRIBUTE  BY 語句要寫在SORT  BY  語句之前

對於distribute by進行測試,一定要分配多reduce進行處理,否則無法看到distribute by的效
果。
案例實操:先按照學生id進行分區,再按照學生成績進行排序。
          1. 設置reduce的個數,將我們對應的s_id劃分到對應的reduce當中去
          set mapreduce.job.reduces=7;

          2.通過distribute   by  進行數據的分區

              insert overwrite local directory '/export/servers/hivedatas/sort' select *
from score distribute by s_id sort by s_score;

CLUSTER  BY:

    當distribute  by  和sort   by    字段相同時,可以使用cluster  by 方式。

   cluster  by  除了具有distribute   by 的功能外還兼具sort   by 的功能,但是排序只能是倒序排序,不能指定排序規則  爲ASC  或者DESC;

   以下兩種寫法等價:

select * from score cluster by s_id;
select * from score distribute by s_id sort by s_id;
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章