order by 語法操作
- order by 是進(jìn)行全局排序,在整個(gè)作業(yè)執(zhí)行過程中,只產(chǎn)生一個(gè) reducer,在數(shù)據(jù)量過大的時(shí)候,執(zhí)行的時(shí)間會很長 。事實(shí)上,這與分布式的思想是相背離的。
創(chuàng)建測試表并加載數(shù)據(jù)。
hive> create table recommend.test_tb(userid string, name string, age int)
> row format delimited
> fields terminated by ',';
數(shù)據(jù)加載。
hive> select * from recommend.test_tb;
OK
1 Jack 21
3 Tom 19
5 Will 20
4 Lily 28
7 zs 25
6 lss 22
使用 order by 語義進(jìn)行處理, order by 語義有兩個(gè)排序方式的選擇--升序和降序,其中默認(rèn)為升序。
hive> select * from recommend.test_tb order by userid;
OK
1 Jack 21
3 Tom 19
4 Lily 28
5 Will 20
6 lss 22
7 zs 25
sort by 語法
- sort by 會在 mapper 輸出時(shí)對進(jìn)入每個(gè) reducer 的數(shù)據(jù)進(jìn)行一次排序。它的數(shù)據(jù)處理是并行的,而且在每個(gè) reducer 中是有序的,然而,在全局范圍內(nèi)并不是嚴(yán)格有序的。當(dāng)然,如果將 reducer 數(shù)量限定為 1,也可保證它的全局有序性,此時(shí)起到的作用跟 order by 極為相似,但是不符合分布式的思想。
- sort by 可以在查詢時(shí)指定 reducer 的個(gè)數(shù),例如:
hive> set mapred.reduce.tasks=;
hive> select * from recommend.test_tb order by userid;
- sort by 是在是跟句 hash 算法將 mapper 輸出數(shù)據(jù)分發(fā)到每個(gè) reducer 中。因此,這種方式不同的 reducer 中的數(shù)據(jù)雖然有序,但是范圍是有重疊的。
distribute by 語法
- distribute by 保證不同的 reducer 中的數(shù)據(jù)不存在重疊,但是不能保證單個(gè) reducer 中的數(shù)據(jù)是有序的是。因此,通常情況下,想要得到有序非重疊的 reducer ,可以將 distribute by 與 sort by 結(jié)合使用。
Cluster by 語法
- Cluster by 的用法就行將 distribute by 與 sort by 結(jié)合使用,輸出我們想要的結(jié)果,例如:
hive> select * from recommend.test_tb distribute by userid sort by userid;
hive> select * from recommend.test_tb cluster by userid;
- 使用 Cluster by 可以得到 reducer 內(nèi)有序且不同 reducer 之間不重疊的數(shù)據(jù)。
- cluster by 只能按照降序進(jìn)行排序,不能指定升序(asc)和降序(desc)。