order by會對輸入做全域性排序,因此只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間
sort by不是全域性排序,其在資料進入reducer前完成排序。因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1,則sort by只保證每個reducer的輸出有序,不保證全域性有序,即每個檔案是有序的。如果mapred.reduce.tasks=1,sort by結果和order by一樣。一般sort by不單獨使用,而是和distribute by一起使用。
distribute by(字段)把根據指定的字段將資料分到不同的reducer,且分發演算法是hash雜湊常和sort by排序一起使用。
1)distribute by負責把檔案雜湊雜湊到不同檔案,sort by負責給不同檔案進行排序
2)當然必須要設定set mareduce.job.reduces 數量,設定的reduces數量個數,就是實際hash雜湊的檔案個數,因為hash 雜湊的是通過hash值與reduce個數取模決定儲存在哪個檔案裡的。所以如果不設定 reduces個數,即使distribute by+sort by結果還是和 order by結果一樣的
cluster by(字段)除了具有distribute by的功能外,還會對該字段進行類似sort by的排序;因此分桶和sort欄位是同乙個時,此時,cluster by = distribute by + sort by
order by全域性排序 select * from emp where empno >7800 order by empno limit 3 ;(顯示工號大於7800員工的最後三名。)只是針對所有資料全域性排序,全域性排序只有乙個reducer,效率低,執行慢。
sort by排序,為每個reducer產生乙個排序檔案
1)設定 mapreduce.job.reduces 即reduce任務個數 ,如果為1跟order by 解果一樣。
set mapreduce.job.reduces; 回車以後顯示mapred.reduce.task的值
set mapreduce.job.reduces=3;臨時設定的值,一旦hive關閉重啟就沒用了。
2)sort by是在reduce之間排序,
insert overwrite local directory '/home/ruoze/data/emp_sort'
row format delimited fields terminated by '\t'
select empno,ename ,deptno from emp sort by empno;
結果是3個檔案,隨機分布的資料,然後給每個資料夾裡的資料按empno進行了排序。
-rw-r--r-- 1 ruoze ruoze 98 dec 27 11:40 000000_0
-rw-r--r-- 1 ruoze ruoze 84 dec 27 11:40 000001_0
-rw-r--r-- 1 ruoze ruoze 27 dec 27 11:40 000002_0
[ruoze@ruozedata001 emp_sort]$ cat 000000_0
7654 martin 30
7698 blake 30
7782 clark 10
7788 scott 20
7839 king 10
7844 turner 30
8888 hive \n
distributed 類似於mapreduce裡的patition分割槽(根據指定值hash雜湊到不同檔案)一般要結合sort by使用。
insert overwrite local directory '/home/ruoze/data/emp_distribute'
row format delimited fields terminated by '\t'
select empno,ename ,deptno from emp distribute by deptno sort by empno;
-rw-r--r-- 1 ruoze ruoze 98 dec 27 12:02 000000_0
-rw-r--r-- 1 ruoze ruoze 42 dec 27 12:02 000001_0
-rw-r--r-- 1 ruoze ruoze 69 dec 27 12:02 000002_0
[ruoze@ruozedata001 emp_distribute]$ cat 000000_0
7499 allen 30
7521 ward 30
7654 martin 30
7698 blake 30
7844 turner 30
7900 james 30
8888 hive \n
這裡的輸出結果是sort下面三個檔案,分別是三個部門員工的檔案,且每個部門按工號排序
cluster by :除了具有distribute by的分割槽的功能外,還會對該字段進行排序;當distribute和sort欄位相同時,就是cluster by,即分割槽的字段和排序的字段相同
insert overwrite local directory '/home/ruoze/data/emp_cluster'
row format delimited fields terminated by '\t'
select empno,ename ,deptno from emp cluster by empno;
等價於insert overwrite local directory '/home/ruoze/data/emp_cluster'
row format delimited fields terminated by '\t'
select empno,ename ,deptno from emp
distribute by empno
sort by empno;
注意:cluter by 可以用sort by + distribute by 替換,但反過來不一定可以替換
四 排序演算法
1.快速排序 procedure qsort l,r integer var i,j,mid integer begin i l j r mid a l r div 2 repeat while a i mid do dec j if i j then begin swap a i a j inc ...
php四排序 選擇排序
原理 在一列數字中,選出最小數與第乙個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。以下都是公升序排列,即從小到大排列 舉例說明 arr array 6,3,8,2,9,1 第一輪 第一次比較,第乙個數 6 與 3,8,2,9,1 中 3...
php四排序 氣泡排序
演算法和資料結構是乙個程式設計工作人員的內功,技術牛不牛,一般都會看這兩點。作為php程式設計師,提公升技能當然也得學習演算法。下面介紹四種入門級排序演算法 氣泡排序 選擇排序 插入排序 快速排序。一 氣泡排序 原理 對一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。以下都是公升...