HIVE中,order by、sort by、 distribute by和 cluster by區別,以及cluster by有什麼意義

1. oreder by

      主要是做全局排序。
      只要hive的sql中指定了order by,那麼所有的數據都會到同一個reducer進行處理**(不管有多少map,也不管文件有多少的block,只會啓動一個reducer) **。但是對於大量數據這將會消耗很長的時間去執行。
      這裏跟傳統的sql還有一點區別:如果指定了hive.mapred.mode=strict(默認值是nonstrict),這時就必須指定limit來限制輸出條數。因爲:所有的數據都會在同一個reducer端進行,數據量大的情況下可能不能出結果,那麼在這樣的嚴格模式下,必須指定輸出的條數。

2. sort by

      每個reduce端都會進行排序,也就是局部有序,可以指定多個reduce。同時,如果想測試一下執行的效果,建議將輸出結果保存到本地,並調整reduce的數量。(我設置成3個)

      將查詢結果保存到本地:

insert overwrite 
local directory '/home/data'
select * from stu sort by gradedesc;

      調整reduce的數量:

set mapreduce.job.reduce=3;

      查看reduce的數量:

set mapreduce.job.reduce;

      但是,使用sort by的情況下,分區是隨機分的。

3. distribute by

      指定分區原則。通常和sort by一起用,distribute by必須要寫在sort by之前。理解成:按照XX字段分區,再按照XX字段排序
      舉個例子:

      只按照grade字段排序,但是不指定分區字段:

select * from stu sort by grade;

      先按照class分區,再按照grade排序:

select * from stu distribute by class sort by grade;

4. cluster by

      當distribute by 和 sort by 所指定的字段相同時,即可以使用cluster by。
      注意:cluster by指定的列只能是降序,不能指定asc和desc。

      舉個例子:

select * from stu distribute by class sort by class

      等價於:

select * from stu cluster by class

---------------------------------------------分割線-----------------------------------
      再舉個例子:

select * from stu distribute by class sort by class,name

      等價於

select * from stud distribute cluster by class sort by name

      注意被cluster by指定的列只能是降序,不能指定asc和desc。

5. cluster by有什麼意義?

      具體請查看:HIVE中,cluster by有什麼意義

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