生活随笔
收集整理的這篇文章主要介紹了
人民大学云计算编程的网上评估平台--解题报告 1001-1003
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這幾天忙著找實習(xí),所以日志耽擱了,現(xiàn)在來補起~~。
相信很多人都知道??PKU Online Judge,?現(xiàn)在中國人民大學(xué)也提供了一個類似的平臺,但與北京在線評判系統(tǒng)不一樣的是,中國人民大學(xué)的這個系統(tǒng)是專門評判mapreduce編程題的。
我把鏈接發(fā)出來,大家可以去試著做看看:?http://cloudcomputing.ruc.edu.cn/index.jsp
大家在做題前,先看看“常見問題”根據(jù)系統(tǒng)要求的格式來寫程序。不然不能正常運行。(我就是直接運行錯了3次。 - -!)
可以看到這個平臺的題目還不多,現(xiàn)在只有1000-1009,其中1008-1009的題目還沒發(fā)出來。所以我們討論1000-1007.
如果你想先自己測試下,下面的文章就可以先不忙看。等你解決其中的題,可以再來看這篇文章,大家可以共同提高。
1000 比較簡單,用hadoop自帶的例子都可以解決,我這里就不多說了。
1001 題目:
a+b?per?line
描述
有時候你會遇到這樣的問題:你有一個表格,給出了每個人在十二月,一月和二月的收入。表格如下:
name??Dec???Jan($)
CM????200???314
LY????2000??332
QQM???6000??333
ZYM???5000??333
BP????30????12?
你需要知道每個人這三個月的收入總和,那么你就需要將表格中一行代表收入的數(shù)字相加.下面請編寫程序解決這個問題。
輸入
輸入只包含一個文件,文件中有一個表格,它的結(jié)構(gòu)如下:
1?200???314
2?2000??332
3?6000??333
4?5000??333
5?30????12???
其中每行最前面的數(shù)字是行標(biāo)
輸出
輸出是一個文本文件,每一行第一個數(shù)字式行標(biāo),第二個數(shù)字是輸入文件中每一行除行標(biāo)外數(shù)字的和。如下:
1?514
2?2332
3?6333
4?5333
5?42
輸入樣例
input:
1?200???314
2?2000??332
3?6000??333
4?6000??333
5?5000??333
6?30????12?
輸出樣例:
1?514
2?2332
3?6333
4?6333
5?5333
6?42
注意:
1?輸入文件和輸出文件都只有一個;
2?輸入和輸出文件每行的第一個數(shù)字都是行標(biāo);
3?每個數(shù)據(jù)都是正整數(shù)或者零.。
1001 解題思路:
1001的題目其實是很簡單的,將讀入的每一行用空格分隔,第一個域就是行號作為key、再將第二個域和第三個域相加作為value.
因為map階段會根據(jù)key值自動排序,我們就不用操心了。至于key的排序順序,我們以后討論。
現(xiàn)在上代碼:
[java]?view plaincopy
public?class?MyMapre?{?? public?static??class?wordcountMapper?extends?? Mapper{?? public?void?map(LongWritable?key,?Text?value,?Context?context)throws?IOException,?InterruptedException{?? Integer?sum?=?0;?? String?line?=?value.toString();?? StringTokenizer?itr?=?new?StringTokenizer(line);?? if?(itr.hasMoreElements())?? key?=?new?LongWritable(Integer.parseInt(itr.nextToken()));???? while(itr.hasMoreElements()){?? sum?+=?Integer.parseInt(itr.nextToken());??? }?? context.write(key,?new?IntWritable(sum));?? }?? }?? public?static??void?main(String?args[])throws?Exception{?? ?? Configuration?conf?=?new?Configuration();?? ?? Job?job?=?new?Job(conf,?"MyMapre");?? ?? job.setJarByClass(MyMapre.class);?? ?? job.setMapOutputKeyClass(LongWritable.class);?? job.setMapOutputValueClass(IntWritable.class);?? ?? job.setOutputKeyClass(LongWritable.class);?? job.setOutputValueClass(IntWritable.class);?? ?? job.setMapperClass(wordcountMapper.class);?? ?? FileInputFormat.setInputPaths(job,?new?Path(args[0]));?? FileOutputFormat.setOutputPath(job,?new?Path(args[1]));?? ?? job.waitForCompletion(true);?? }?? }??
1002 題目:
Sort
描述
你的程序需要讀入輸入數(shù)據(jù)文件,然后再將數(shù)據(jù)按升序排序后輸出。在輸入文件中,每一行都代表一個數(shù)據(jù)。
輸入
輸入是一組文本文件,在文本文件中每一行都是一個元數(shù)據(jù),而且每個數(shù)據(jù)是用一個數(shù)字串代表待排序的數(shù)字。
輸出
輸出文件中每一行第一個數(shù)字是行標(biāo),后面一個數(shù)字是排好序的原始輸入數(shù)據(jù),注意排序順序是從小到大升序排序。
輸入樣例
input1:
2
32
654
32
15
756
65223
input2:
5956
22
650
92
input3:
26
54
6
輸出樣例:
1?2
2?6
3?15
4?22
5?26
6?32
7?32
8?54
9?92
10?650
11?654
12?756
13?5956
14?65223
1002 解題思路:
在上一題已經(jīng)說過在map階段會對key自動排序, 所以我們讀入一行后(元數(shù)據(jù)),將其作為key,傳遞給reduce。我們可以看到最后輸出的樣例,還需要打印出行號。所以我們在reduce外面定義一個int 來記錄總的行數(shù)(作為key輸出)。而將map階段傳來的key作為reduce階段的value輸出。
上代碼吧:
[java]?view plaincopy
public?class?MyMapre?{?? public?static??class?wordcountMapper?extends?? Mapper{?? public?void?map(LongWritable?key,?Text?value,?Context?context)throws?IOException,?InterruptedException{?? String?one?=?value.toString();?? context.write(new?LongWritable(Integer.parseInt(one))?,?key);?? }?? }?? public?static??class?wordcountReduce?extends?? Reducer{?? int?sum?=?0;?? public?void?reduce(LongWritable?key,?Iterablevalues,?Context?context)throws?IOException,?InterruptedException{?? sum++;?? context.write(new?LongWritable(sum),?key);?? }?? }?? public?static??void?main(String?args[])throws?Exception{?? ?? Configuration?conf?=?new?Configuration();?? ?? Job?job?=?new?Job(conf,?"Sort");?? ?? job.setJarByClass(MyMapre.class);?? ?? job.setOutputKeyClass(LongWritable.class);?? job.setOutputValueClass(LongWritable.class);?? ?? job.setMapOutputKeyClass(LongWritable.class);?? job.setMapOutputValueClass(LongWritable.class);?? ?? job.setMapperClass(wordcountMapper.class);?? job.setReducerClass(wordcountReduce.class);?? ?? FileInputFormat.setInputPaths(job,?new?Path(args[0]));?? FileOutputFormat.setOutputPath(job,?new?Path(args[1]));?? ?? job.waitForCompletion(true);?? }?? }??
1003 題目:
Data?deduplication
描述
你的程序要求讀入輸入文件,在去掉所有數(shù)據(jù)中的重復(fù)數(shù)據(jù)后輸出結(jié)果。在輸入文件中每一行是一個元數(shù)據(jù)。
輸入
輸入是一組文本文件,在每個輸入文件中每一行是一個數(shù)據(jù)。每一個元數(shù)據(jù)都是一個字符串。
輸出文件
輸出文件的每一行都是在輸入文件中出現(xiàn)過的一個數(shù)據(jù),并且輸出文件中的每一行都不相同。
輸入樣例
input1:
2006-6-9?a
2006-6-10?b
2006-6-11?c
2006-6-12?d
2006-6-13?a
2006-6-14?b
2006-6-15?c
2006-6-11?c
input2:
2006-6-9?b
2006-6-10?a
2006-6-11?b
2006-6-12?d
2006-6-13?a
2006-6-14?c
2006-6-15?d
2006-6-11?c
輸出樣例:
2006-6-10?a?
2006-6-10?b?
2006-6-11?b?
2006-6-11?c?
2006-6-12?d?
2006-6-13?a?
2006-6-14?b?
2006-6-14?c?
2006-6-15?c?
2006-6-15?d?
2006-6-9?a?
2006-6-9?b
注意:
1?輸出結(jié)果是按照字典順序排序的;
2?每一行都是一個元數(shù)據(jù);
3?重復(fù)數(shù)據(jù)在輸出文件中也要輸出一次。
1003 解題思路:
首先還是將一行進(jìn)行劃分,將第一個域作為map階段的key輸出。第二個域作為map階段的value輸出。
reduce收到key-value對后,key相同時,會返回多個value。根據(jù)題意要求,value中出現(xiàn)的字母不能重復(fù),所以我們要消掉重復(fù)的字母、而且最后需要排序,我們可以調(diào)用java自帶的排序函數(shù)來實現(xiàn)。
上代碼了:
[java]?view plaincopy
public?class?MyMapre?{?? public?static??class?wordcountMapper?extends?? Mapper{?? public?void?map(LongWritable?key,?Text?value,?Context?context)throws?IOException,?InterruptedException{?? String?line?=?value.toString();?? Text?word?=?new?Text();?? Text?one?=?new?Text();?? StringTokenizer?itr?=?new?StringTokenizer(line);?? if?(itr.hasMoreElements())?word.set(itr.nextToken());?? if?(itr.hasMoreElements())?one.set(itr.nextToken());?? ?? context.write(word,?one);?? }?? }?? public?static??class?wordcountReduce?extends?? Reducer{?? ?? public?void?reduce(Text?key,?Iterablevalues,?Context?context)throws?IOException,?InterruptedException{?? String?pre?=?"";??? List?list?=?new?ArrayList();??? for?(Text?str?:?values){?? if?(!str.toString().equals(pre))?{???? pre?=?str.toString();??? list.add(pre);???? }??? }?? Collections.sort(list);???? for?(int?i?=?0;?i?<?list.size();?i++)?? context.write(key,?new?Text(list.get(i)));???? }?? }?? ?? ?? public?static??void?main(String?args[])throws?Exception{?? ?? Configuration?conf?=?new?Configuration();?? ?? Job?job?=?new?Job(conf,?"deduplication");?? ?? job.setJarByClass(MyMapre.class);?? ?? job.setOutputKeyClass(Text.class);?? job.setOutputValueClass(Text.class);?? ?? job.setMapOutputKeyClass(Text.class);?? job.setMapOutputValueClass(Text.class);?? ?? job.setMapperClass(wordcountMapper.class);?? job.setReducerClass(wordcountReduce.class);?? ?? FileInputFormat.setInputPaths(job,?new?Path(args[0]));?? FileOutputFormat.setOutputPath(job,?new?Path(args[1]));?? ?? job.waitForCompletion(true);?? }??
總結(jié)
以上是生活随笔為你收集整理的人民大学云计算编程的网上评估平台--解题报告 1001-1003的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。