我是靠谱客的博主 强健蜜蜂,最近开发中收集的这篇文章主要介绍Hadoop多路径输出(MultipleOutputs),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用Hadoop进行数据处理时,有时候需要将计算结果根据不同的条件存入不同的分区。

比如:计算顾客是否回头购买的时候,会将回头了的顾客数据和未回头的顾客数据分别存入不同的表。

可以使用MultipleOutputs实现。

需要在reduce类中定义MultipleOutputs,并且重写Reducer的setup()方法和cleanup()方法。具体实例如下

public static class PeriodReduce extends Reducer<TextPair,Text,NullWritable,Text>{
		private MultipleOutputs<NullWritable, Text> mos;
		
		protected void setup(Context context)throws IOException,InterruptedException{
			mos = new MultipleOutputs<NullWritable, Text>(context);
		}
		
		protected void cleanup(Context context)throws IOException,InterruptedException{
			mos.close();
		}
		
		public void reduce(TextPair key,Iterable<Text> values,Context context)throws IOException,InterruptedException{
			
			Iterator<Text> it = values.iterator();
			ArrayList<String> custInfo = null;
			String last ="notexist";
			String ret = "notexist";
			while (it.hasNext()){
				String line = it.next().toString();
				//排序后,先到达reduce的数据是上个周期的
				if(key.getId()==0){
					custInfo = new ArrayList<String>();
					//将上个周期的购买情况存放
					custInfo.add(line);
					last = "exist";
				}else if(key.getId()==1){
					ret = "exist";
					//如果回头,则加上上个周期信息放入return目录下
					if("exist".equals(last)&&custInfo.size()>0){
						for(String str:custInfo){
							mos.write(NullWritable.get(), new Text(line+"01"+str),"return/r");
						}
					}
				}
				
				//如果没有回头,直接输出上期
				if("exist".equals(last)&&"notexist".equals(ret)){
					for(String str:custInfo){
						mos.write(NullWritable.get(), new Text(key.getText()+"01"+str),"loss/l");
					}
					
				}
			}
		}

	}


最后

以上就是强健蜜蜂为你收集整理的Hadoop多路径输出(MultipleOutputs)的全部内容,希望文章能够帮你解决Hadoop多路径输出(MultipleOutputs)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部