寫mapreduce程序時,如果reduce個數(shù)>1硕蛹,想要實現(xiàn)全排序需要控制好map的輸出,詳見Hadoop簡單實現(xiàn)全排序
現(xiàn)在學了hive噪裕,寫sql大家都很熟悉促煮,如果一個order by解決了全排序還用那么麻煩寫mapreduce函數(shù)嗎胳施?
事實上花沉,hive使用order by會默認設置reduce的個數(shù)=1况凉,既然reducer的個數(shù)都是1了谨湘,結果自然全排序绽快!
這也違背了充分利用分布式計算進行海量數(shù)據(jù)排序的初衷,效率低下紧阔。
那么hive又提供了一個可供選擇的方式:sort by
它會保證每個reducer的輸出文件是有序的(其實是廢話坊罢,每個reducer的輸出當然是有序的!)擅耽,要想實現(xiàn)全排序活孩,還得加一個order by的過程,就是對sort by的reduce輸出結果再進行一次排序乖仇。
所以:
要想用hive實現(xiàn)全排序:
要么用order by憾儒,但這樣默認了reducer個數(shù)為1询兴,效率低下。
要么用sort by+order by起趾,sort by過程可以設置reducer個數(shù)(n)诗舰,order by過程用n個reducer的輸出文件進行一次全排序,得到最終的結果训裆。
(個人理解眶根,如有錯誤請不吝賜教,感謝g员!)
注:
(1)對于order by汛闸,sort
by:
我們可以使用limit進行限制返回的行數(shù)蝙茶,從而實現(xiàn)抓出數(shù)據(jù)的top N的情形艺骂。
(2)對于distribute by:
sort by為每個reducer產(chǎn)生一個排序文件。在有些情況下隆夯,你需要控制某個特定行應該到哪個reducer钳恕,通常是為了進行后續(xù)的聚集操作。hive的distribute by就派上用場了:
From?table
select?year,?temperature
distribute?by?year
sort?by?year?asc,?temperature?desc;?
上面實現(xiàn)了局部排序蹄衷,且規(guī)定了:根據(jù)年份和氣溫對氣象數(shù)據(jù)進行排序忧额,以確保所有具有相同年份的行最終都在一個reducer分區(qū)中(文件下),可以看出愧口,distribute by經(jīng)常與sort by一起使用睦番。
需要注意的是,hive要求distribute by要寫在sort by之前耍属。
(3)對于cluster by:
簡而言之:cluster by column=distribute by column+sort by column(注意托嚣,都是針對column列,且采用默認ASC)
即對于上面例子:
From?table
select?year,?temperature
cluster?by?year;
就等于:
From?table
select?year,?temperature
distribute?by?year
sort?by?year;?
當然這失去了按照氣溫排序的要求厚骗。