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有什麼意義。