轉(zhuǎn)載請(qǐng)?jiān)谖恼缕鹗继幾⒚鞒鎏帲x謝健民。
一:order by
order by會(huì)對(duì)輸入做全局排序抒巢,因此只有一個(gè)Reducer(多個(gè)Reducer無法保證全局有序),然而只有一個(gè)Reducer秉犹,會(huì)導(dǎo)致當(dāng)輸入規(guī)模較大時(shí)虐秦,消耗較長的計(jì)算時(shí)間平酿。
二:sort by
sort by不是全局排序,其在數(shù)據(jù)進(jìn)入reducer前完成排序悦陋,因此蜈彼,如果用sort by進(jìn)行排序,并且設(shè)置mapred.reduce.tasks>1俺驶,則sort by只會(huì)保證每個(gè)reducer的輸出有序幸逆,并不保證全局有序。sort by不同于order by暮现,它不受hive.mapred.mode屬性的影響还绘,sort by的數(shù)據(jù)只能保證在同一個(gè)reduce中的數(shù)據(jù)可以按指定字段排序。使用sort by你可以指定執(zhí)行的reduce個(gè)數(shù)(通過set mapred.reduce.tasks=n來指定)栖袋,對(duì)輸出的數(shù)據(jù)再執(zhí)行歸并排序拍顷,即可得到全部結(jié)果。
三:distribute by
distribute by是控制在map端如何拆分?jǐn)?shù)據(jù)給reduce端的塘幅。hive會(huì)根據(jù)distribute by后面列昔案,對(duì)應(yīng)reduce的個(gè)數(shù)進(jìn)行分發(fā),默認(rèn)是采用hash算法电媳。sort by為每個(gè)reduce產(chǎn)生一個(gè)排序文件踏揣。在有些情況下,你需要控制某個(gè)特定行應(yīng)該到哪個(gè)reducer匾乓,這通常是為了進(jìn)行后續(xù)的聚集操作捞稿。distribute by剛好可以做這件事。因此拼缝,distribute by經(jīng)常和sort by配合使用娱局。
注:Distribute by和sort by的使用場(chǎng)景
1.Map輸出的文件大小不均。
2.Reduce輸出文件大小不均咧七。
3.小文件過多衰齐。
4.文件超大。
四:cluster by
cluster by除了具有distribute by的功能外還兼具sort by的功能猪叙。但是排序只能是倒敘排序娇斩,不能指定排序規(guī)則為ASC或者DESC仁卷。