2.12 Hivet中order by,sort by、distribute by和cluster by
生活随笔
收集整理的這篇文章主要介紹了
2.12 Hivet中order by,sort by、distribute by和cluster by
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy
一、order by
對全局數據的排序,僅僅只有一個reduce;Hive中的order by跟傳統的sql語言中的order by作用是一樣的,會對查詢的結果做一次全局排序, 所以說,只有hive的sql中制定了order by所有的數據都會到同一個reducer進行處理(不管有多少map, 也不管文件有多少的block只會啟動一個reducer)。但是對于大量數據這將會消耗很長的時間去執行。這里跟傳統的sql還有一點區別:如果指定了hive.mapred.mode=strict(默認值是nonstrict),這時就必須 指定limit來限制輸出條數,原因是:所有的數據都會在同一個reducer端進行,數據量大的情況下可能 不能出結果,那么在這樣的嚴格模式下,必須指定輸出的條數。hive (db_hive)> select * from emp order by empno desc;二、sort by
Hive中指定了sort by,那么在每個reducer端都會做排序,也就是說保證了局部有序(每個reducer出來的數據是有序的, 但是不能保證所有的數據是有序的,除非只有一個reducer),好處是:執行了局部排序之后可以為接下去的全局排序提高不少的效率 (其實就是做一次歸并排序就可以做到全局排序了)。#我們可以設置一下reduce的個數 hive (db_hive)> set mapreduce.job.reduces= 3; hive (db_hive)> set mapreduce.job.reduces; mapreduce.job.reduces=3#再執行的時候就會有3個reduce結果,在命令行上輸出結果時默認合并了, hive (db_hive)> select * from emp sort by empno asc;#如果用下面語句將結果插入到本地目錄,就會看到三個結果集 insert overwrite local directory'/opt/datas/sortby-res'select * from emp sort by empno asc;[root@hadoop-senior ~]# ls /opt/datas/sortby-res/ 000000_0 000001_0 000002_0[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000000_0 7654MARTINSALESMAN76981981-9-281250.01400.030 7698BLAKEMANAGER78391981-5-12850.0\N30 7782CLARKMANAGER78391981-6-92450.0\N10 7788SCOTTANALYST75661987-4-193000.0\N20 7839KINGPRESIDENT\N1981-11-175000.0\N10 7844TURNERSALESMAN76981981-9-81500.00.030[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000001_0 7499ALLENSALESMAN76981981-2-201600.0300.030 7521WARDSALESMAN76981981-2-221250.0500.030 7566JONESMANAGER78391981-4-22975.0\N20 7876ADAMSCLERK77881987-5-231100.0\N20 7900JAMESCLERK76981981-12-3950.0\N30 7934MILLERCLERK77821982-1-231300.0\N10[root@hadoop-senior ~]# cat /opt/datas/sortby-res/000002_0 7369SMITHCLERK79021980-12-17800.0\N20 7902FORDANALYST75661981-12-33000.0\N20三、distribute by
類似于MapReduce中分區partition,對數據進行分區,結合sort by進行使用;
distribute by必須要寫在sort by之前,因為distribute by的功能是要先分區,sort by是對分區進行排序的;
#我這里是對deptno進行分區,然后對empno排序 hive (db_hive)> insert overwrite local directory '/opt/datas/distby-res' select * from emp distribute by deptno sort by empno asc;#emp表的最后一個字段是deptno,從下面可以看出是按最后一個字段分區的 [root@hadoop-senior ~]# cat /opt/datas/distby-res/000000_0 7499ALLENSALESMAN76981981-2-201600.0300.030 7521WARDSALESMAN76981981-2-221250.0500.030 7654MARTINSALESMAN76981981-9-281250.01400.030 7698BLAKEMANAGER78391981-5-12850.0\N30 7844TURNERSALESMAN76981981-9-81500.00.030 7900JAMESCLERK76981981-12-3950.0\N30[root@hadoop-senior ~]# cat /opt/datas/distby-res/000001_0 7782CLARKMANAGER78391981-6-92450.0\N10 7839KINGPRESIDENT\N1981-11-175000.0\N10 7934MILLERCLERK77821982-1-231300.0\N10[root@hadoop-senior ~]# cat /opt/datas/distby-res/000002_0 7369SMITHCLERK79021980-12-17800.0\N20 7566JONESMANAGER78391981-4-22975.0\N20 7788SCOTTANALYST75661987-4-193000.0\N20 7876ADAMSCLERK77881987-5-231100.0\N20 7902FORDANALYST75661981-12-33000.0\N20四、cluster by
當distribute by和sort by字段相同時,可以使用cluster by;
cluster by 除了具有 distribute by 的功能外還兼具 sort by 的功能。 所以最終的結果是每個Reduce處理的數據范圍不重疊,
而且每個Reduce內的數據是排序的,而且可以打到全局有序的結果。
## hive (db_hive)> insert overwrite local directory '/opt/datas/cluster-res' select * from emp cluster by empno; ## [root@hadoop-senior ~]# ls /opt/datas/cluster-res/ 000000_0 000001_0 000002_0[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000000_0 7521WARDSALESMAN76981981-2-221250.0500.030 7566JONESMANAGER78391981-4-22975.0\N20 7698BLAKEMANAGER78391981-5-12850.0\N30 7782CLARKMANAGER78391981-6-92450.0\N10 7788SCOTTANALYST75661987-4-193000.0\N20 7839KINGPRESIDENT\N1981-11-175000.0\N10 7902FORDANALYST75661981-12-33000.0\N20[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000001_0 7369SMITHCLERK79021980-12-17800.0\N20 7654MARTINSALESMAN76981981-9-281250.01400.030 7876ADAMSCLERK77881987-5-231100.0\N20 7900JAMESCLERK76981981-12-3950.0\N30[root@hadoop-senior ~]# cat /opt/datas/cluster-res/000002_0 7499ALLENSALESMAN76981981-2-201600.0300.030 7844TURNERSALESMAN76981981-9-81500.00.030 7934MILLERCLERK77821982-1-231300.0\N10五、總結
OrderBy 全局排序,一個ReduceSort By 每個reduce內部進行排序,全局不是排序Distribute By 類似MR中partition,進行分區,結合sort by使用Cluster By 當distribute和sort字段相同時,使用方式轉載于:https://www.cnblogs.com/weiyiming007/p/10761404.html
總結
以上是生活随笔為你收集整理的2.12 Hivet中order by,sort by、distribute by和cluster by的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第九章:内存管理
- 下一篇: OS X EI Captain 下解决