Hadoop MultipleOutputs输出到多个文件中的实现方法
HadoopMultipleOutputs输出到多个文件中的实现方法
1.输出到多个文件或多个文件夹:
驱动中不需要额外改变,只需要在MapClass或Reduce类中加入如下代码
privateMultipleOutputsmos; publicvoidsetup(Contextcontext)throwsIOException,InterruptedException{ mos=newMultipleOutputs(context); } publicvoidcleanup(Contextcontext)throwsIOException,InterruptedException{ mos.close(); }
然后就可以用mos.write(Keykey,Valuevalue,StringbaseOutputPath)代替context.write(key,value);
在MapClass或Reduce中使用,输出时也会有默认的文件part-m-00*或part-r-00*,不过这些文件是无内容的,大小为0.而且只有part-m-00*会传给Reduce。
注意:multipleOutputs.write(key,value,baseOutputPath)方法的第三个函数表明了该输出所在的目录(相对于用户指定的输出目录)。
如果baseOutputPath不包含文件分隔符“/”,那么输出的文件格式为baseOutputPath-r-nnnnn(name-r-nnnnn);
如果包含文件分隔符“/”,例如baseOutputPath=“029070-99999/1901/part”,那么输出文件则为029070-99999/1901/part-r-nnnnn
2.案例-需求
需求,下面是有些测试数据,要对这些数据按类目输出到output中:
1512,iphone5s,4英寸,指纹识别,A7处理器,64位,M7协处理器,低功耗 1512,iphone5,4英寸,A6处理器,IOS7 1512,iphone4s,3.5英寸,A5处理器,双核,经典 50019780,ipad,9.7英寸,retina屏幕,丰富的应用 50019780,yoga,联想,待机18小时,外形独特 50019780,nexus7,华硕&google,7英寸 50019780,ipadmini2,retina显示屏,苹果,7.9英寸 1101,macbookair,苹果超薄,OSXmavericks 1101,macbookpro,苹果,OSXlion 1101,thinkpadyoga,联想,windows8,超级本
3.Mapper程序:
packagecn.edu.bjut.multioutput; importjava.io.IOException; importorg.apache.hadoop.io.IntWritable; importorg.apache.hadoop.io.LongWritable; importorg.apache.hadoop.io.Text; importorg.apache.hadoop.mapreduce.Mapper; publicclassMultiOutPutMapperextendsMapper{ @Override protectedvoidmap(LongWritablekey,Textvalue,Contextcontext) throwsIOException,InterruptedException{ Stringline=value.toString().trim(); if(null!=line&&0!=line.length()){ String[]arr=line.split(","); context.write(newIntWritable(Integer.parseInt(arr[0])),value); } } }
4.Reducer程序:
packagecn.edu.bjut.multioutput; importjava.io.IOException; importorg.apache.hadoop.io.IntWritable; importorg.apache.hadoop.io.NullWritable; importorg.apache.hadoop.io.Text; importorg.apache.hadoop.mapreduce.Reducer; importorg.apache.hadoop.mapreduce.lib.output.MultipleOutputs; publicclassMultiOutPutReducerextends Reducer{ privateMultipleOutputs multipleOutputs=null; @Override protectedvoidreduce(IntWritablekey,Iterable values,Contextcontext) throwsIOException,InterruptedException{ for(Texttext:values){ multipleOutputs.write("KeySpilt",NullWritable.get(),text,key.toString()+"/"); multipleOutputs.write("AllPart",NullWritable.get(),text); } } @Override protectedvoidsetup(Contextcontext) throwsIOException,InterruptedException{ multipleOutputs=newMultipleOutputs (context); } @Override protectedvoidcleanup(Contextcontext) throwsIOException,InterruptedException{ if(null!=multipleOutputs){ multipleOutputs.close(); multipleOutputs=null; } } }
5.主程序:
packagecn.edu.bjut.multioutput; importorg.apache.hadoop.conf.Configuration; importorg.apache.hadoop.fs.FileSystem; importorg.apache.hadoop.fs.Path; importorg.apache.hadoop.io.IntWritable; importorg.apache.hadoop.io.NullWritable; importorg.apache.hadoop.io.Text; importorg.apache.hadoop.mapreduce.Job; importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat; importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat; importorg.apache.hadoop.mapreduce.lib.output.MultipleOutputs; importorg.apache.hadoop.mapreduce.lib.output.TextOutputFormat; publicclassMainJob{ publicstaticvoidmain(String[]args)throwsException{ Configurationconf=newConfiguration(); Jobjob=newJob(conf,"aaa"); job.setJarByClass(MainJob.class); job.setMapperClass(MultiOutPutMapper.class); job.setMapOutputKeyClass(IntWritable.class); job.setMapOutputValueClass(Text.class); job.setReducerClass(MultiOutPutReducer.class); job.setOutputKeyClass(NullWritable.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job,newPath(args[0])); MultipleOutputs.addNamedOutput(job,"KeySpilt",TextOutputFormat.class,NullWritable.class,Text.class); MultipleOutputs.addNamedOutput(job,"AllPart",TextOutputFormat.class,NullWritable.class,Text.class); PathoutPath=newPath(args[1]); FileSystemfs=FileSystem.get(conf); if(fs.exists(outPath)){ fs.delete(outPath,true); } FileOutputFormat.setOutputPath(job,outPath); job.waitForCompletion(true); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。