第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

hadoop 怎么定義分組函數(shù)?

hadoop 怎么定義分組函數(shù)?

神不在的星期二 2018-11-25 14:10:43
hadoop 怎么定義分組函數(shù)
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

1.二次排序概念:

首先按照第一字段排序,然后再對(duì)第一字段相同的行按照第二字段排序,注意不能破壞第一次排序的結(jié)果 。

如: 輸入文件:

20 21
50 51
50 52
50 53
50 54
60 51
60 53
60 52
60 56
60 57
70 58
60 61
70 54
70 55
70 56
70 57
70 58
1 2
3 4
5 6
7 82
203 21
50 512
50 522
50 53
530 54
40 511
20 53
20 522
60 56
60 57
740 58
63 61
730 54
71 55
71 56
73 57
74 58
12 211
31 42
50 62
7 8

輸出(需要分割線):

------------------------------------------------
1 2
------------------------------------------------
3 4
------------------------------------------------
5 6
------------------------------------------------
7 8
7 82
------------------------------------------------
12 211
------------------------------------------------
20 21
20 53
20 522
------------------------------------------------
31 42
------------------------------------------------
40 511
------------------------------------------------
50 51
50 52
50 53
50 53
50 54
50 62
50 512
50 522
------------------------------------------------
60 51
60 52
60 53
60 56
60 56
60 57
60 57
60 61
------------------------------------------------
63 61
------------------------------------------------
70 54
70 55
70 56
70 57
70 58
70 58
------------------------------------------------
71 55
71 56
------------------------------------------------
73 57
------------------------------------------------
74 58
------------------------------------------------
203 21
------------------------------------------------
530 54
------------------------------------------------
730 54
------------------------------------------------
740 58

2.工作原理

使用如下map和reduce:(特別注意輸入輸出類型, 其中IntPair為自定義類型)

public static class Map extends Mapper<LongWritable, Text, IntPair, IntWritable>
public static class Reduce extends Reducer<IntPair, NullWritable, IntWritable, IntWritable>

在map階段,使用job.setInputFormatClass(TextInputFormat)做為輸入格式。注意輸出應(yīng)該符合自定義Map中定義的輸出<IntPair, IntWritable>。最終是生成一個(gè)List<IntPair, IntWritable>。在map階段的最后,會(huì)先調(diào)用job.setPartitionerClass對(duì)這個(gè)List進(jìn)行分區(qū),每個(gè)分區(qū)映射到一個(gè)reducer。每個(gè)分區(qū)內(nèi)又調(diào)用job.setSortComparatorClass設(shè)置的key比較函數(shù)類排序??梢钥吹?,這本身就是一個(gè)二次排序。如果沒(méi)有通過(guò)job.setSortComparatorClass設(shè)置key比較函數(shù)類,則使用key的實(shí)現(xiàn)的compareTo方法。在隨后的例子中,第一個(gè)例子中,使用了IntPair實(shí)現(xiàn)的compareTo方法,而在下一個(gè)例子中,專門(mén)定義了key比較函數(shù)類。

在reduce階段,reducer接收到所有映射到這個(gè)reducer的map輸出后,也是會(huì)調(diào)用job.setSortComparatorClass設(shè)置的key比較函數(shù)類對(duì)所有數(shù)據(jù)對(duì)排序。然后開(kāi)始構(gòu)造一個(gè)key對(duì)應(yīng)的value迭代器。這時(shí)就要用到分組,使用jobjob.setGroupingComparatorClass設(shè)置的分組函數(shù)類。只要這個(gè)比較器比較的兩個(gè)key相同,他們就屬于同一個(gè)組,它們的value放在一個(gè)value迭代器,而這個(gè)迭代器的key使用屬于同一個(gè)組的所有key的第一個(gè)key。最后就是進(jìn)入Reducer的reduce方法,reduce方法的輸入是所有的(key和它的value迭代器)。同樣注意輸入與輸出的類型必須與自定義的Reducer中聲明的一致。

3,具體步驟

(1)自定義key

在mr中,所有的key是需要被比較和排序的,并且是二次,先根據(jù)partitione,再根據(jù)大小。而本例中也是要比較兩次。先按照第一字段排序,然后再對(duì)第一字段相同的按照第二字段排序。根據(jù)這一點(diǎn),我們可以構(gòu)造一個(gè)復(fù)合類IntPair,他有兩個(gè)字段,先利用分區(qū)對(duì)第一字段排序,再利用分區(qū)內(nèi)的比較對(duì)第二字段排序。
所有自定義的key應(yīng)該實(shí)現(xiàn)接口WritableComparable,因?yàn)槭强尚蛄械牟⑶铱杀容^的。并重載方法:

1
2
3
4
5
6
7
8
9
10
//反序列化,從流中的二進(jìn)制轉(zhuǎn)換成IntPair
public void readFields(DataInput in) throws IOException
//序列化,將IntPair轉(zhuǎn)化成使用流傳送的二進(jìn)制
public void write(DataOutput out)
//key的比較
public int compareTo(IntPair o)
//另外新定義的類應(yīng)該重寫(xiě)的兩個(gè)方法
//The hashCode() method is used by the HashPartitioner (the default partitioner in MapReduce)
public int hashCode()
public boolean equals(Object right)
(2)由于key是自定義的,所以還需要自定義一下類:
(2.1)分區(qū)函數(shù)類。這是key的第一次比較。

1
public static class FirstPartitioner extends Partitioner<IntPair,IntWritable>
在job中使用setPartitionerClasss設(shè)置Partitioner。
(2.2)key比較函數(shù)類。這是key的第二次比較。這是一個(gè)比較器,需要繼承WritableComparator(也就是實(shí)現(xiàn)RawComprator接口)。

(這個(gè)就是前面說(shuō)的第二種方法,但是在第三部分的代碼中并沒(méi)有實(shí)現(xiàn)此函數(shù),而是直接使用compareTo方法進(jìn)行比較,所以也就不許下面一行的設(shè)置)
在job中使用setSortComparatorClass設(shè)置key比較函數(shù)類。

1
public static class KeyComparator extends WritableComparator
2.3)分組函數(shù)類。在reduce階段,構(gòu)造一個(gè)key對(duì)應(yīng)的value迭代器的時(shí)候,只要first相同就屬于同一個(gè)組,放在一個(gè)value迭代器。這是一個(gè)比較器,需要繼承WritableComparator。

1
public static class GroupingComparator extends WritableComparator
分組函數(shù)類也必須有一個(gè)構(gòu)造函數(shù),并且重載 public int compare(WritableComparable w1, WritableComparable w2)
分組函數(shù)類的另一種方法是實(shí)現(xiàn)接口RawComparator。
在job中使用setGroupingComparatorClass設(shè)置分組函數(shù)類。
另外注意的是,如果reduce的輸入與輸出不是同一種類型,則不要定義Combiner也使用reduce,因?yàn)镃ombiner的輸出是reduce的輸入。除非重新定義一個(gè)Combiner。



查看完整回答
反對(duì) 回復(fù) 2018-12-08
  • 1 回答
  • 0 關(guān)注
  • 860 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)