MapReduce数据处理两表join连接 (Ruduce端连接)

本文介绍了一种使用Hadoop MapReduce框架合并两个文本文件的方法,并确保合并后的数据无冗余。通过将不同文件中的相关字段作为键值进行匹配,实现了数据的有效整合。

http://blog.youkuaiyun.com/qq272936993/article/details/7457553


现在这里有两个text文档,需要把它合并成一个文档,并且里面的数据不能有冗余..


user.txt文件: 

UserId       UserName   DepNo
10000000     Li         1001
10000001     Wang       1001
10000002     Zhang      1002
10000003     Wei        1004
10000004     He         1003
10000005     Jin        1002



depart.txt文件: 

DepNo        DepName
1001         Develop
1002         Test
1003         HR
1004         Market 



生成文件: 

10000000     Li         1001       Develop
10000001     Wang       1001       Develop
10000002     Zhang      1002       Test
10000003     Wei        1004       Market
10000004     He         1003       HR
10000005     Jin        1002       Test



因为user.txt文档的第3个字段与depart.txt的第1个字段是相同的, 所以我把他们做为key值. 

 

public class Advanced extends Configured implements Tool {

	public static class AdMap extends Mapper<LongWritable, Text, Text, TextPair>{

		@Override
		protected void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
		 	String filePath = ((FileSplit)context.getInputSplit()).getPath().toString();	
		 	String line = value.toString();
		 	String[] childline = line.split(" ");    //以空格截取			       
                        if(filePath.contains("user.txt") ){  //判断是哪一张表
				TextPair pair = new TextPair();
				pair.setFlag("0");         //这是个标识   0.表示 user.txt     1表示depart.txt
				pair.setKey(childline[2]);
				pair.setValue(childline[0]+" "+childline[1]);
				pair.setContent(pair.toString());	
                           context.write(new Text(pair.getKey()), pair);
			}else if (filePath.contains("depart.txt")){
			 	TextPair pair = new  TextPair();
				pair.setFlag("1");
				pair.setKey(childline[0]);
				pair.setValue(childline[0]+" " +childline[1]);
				pair.setContent(pair.toString()); 
				context.write(new Text(pair.getKey()), pair);
		       }		
			
		}		
	}
	
	public static class AdReduce extends Reducer<Text, TextPair, Text, Text>{

		@Override
		public void reduce(Text key, Iterable<TextPair> values,
				Context context)
				throws IOException, InterruptedException {
			 
                        List<Text> listUser = new ArrayList<Text>();     
			List<Text> listDepart = new ArrayList<Text>();
			Iterator<TextPair> it = values.iterator();
			TextPair pair = new TextPair();
			while(it.hasNext()){
				pair = it.next();
				if("0".equals(pair.getFlag())){
				    listUser.add(new Text(pair.getValue()));
                            }
				else {
				    listDepart.add(new Text(pair.getValue()));
                            }
			}
			
			for(int i = 0 ; i<listUser.size(); i++){
			    for(int j = 0 ;j<listDepart.size();j++){ i 
				context.write(key, new Text(listUser.get(j)+" " +listDepart.get(i)));
			    }
			}
			
			
		}
		
	}
	 
	public static void main(String[] args) {
		try {
                   int res = ToolRunner.run(new Configuration(), new Advanced(), args);
			System.exit(res);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public int run(String[] args) throws Exception {
		Configuration conf = new Configuration();
		
		FileSystem fs = FileSystem.get(conf);
		if(fs.exists(new Path(args[2]))){
			System.out.println("error : file is exists");
			System.exit(-1);
		}
		
		Job job = new Job(conf , "Advanced");
		job.setJarByClass(Advanced.class);
		job.setMapperClass(AdMap.class);
		job.setReducerClass(AdReduce.class);
		
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(TextPair.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		FileInputFormat.setInputPaths(job, new Path(args[0]),new Path(args[1]));
		FileOutputFormat.setOutputPath(job, new Path(args[2]));
		return job.waitForCompletion(true) ? 0 : 1;
	} 
}
 		


class TextPair implements WritableComparable<TextPair>{

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}

		@Override
		public String toString() {
			return " " + key +" "+ value; 
		}

		public String getFlag() {
			return flag;
		}

		public void setFlag(String flag) {
			this.flag = flag;
		}

		public String getKey() {
			return key;
		}

		public void setKey(String key) {
			this.key = key;
		}

		public String getContent() {
			return content;
		}

		public void setContent(String content) {
			this.content = content;
		}

		private String flag = "";
		private String key ="";
		private String value ="";
		private String content = "";
		
		

		public TextPair(String flag, String key, String value, String content) {
			this.flag = flag;
			this.key = key;
			this.value = value;
			this.content = content;
		}

		public TextPair() {
		}

		@Override
		public void write(DataOutput out) throws IOException {
			// TODO Auto-generated method stub
			out.writeUTF(this.flag);
			out.writeUTF(this.key);
			out.writeUTF(this.value);
			out.writeUTF(this.content);
		}

		@Override
		public void readFields(DataInput in) throws IOException {
			// TODO Auto-generated method stub
			this.flag = in.readUTF();
			this.key = in.readUTF();
			this.value = in.readUTF();
			this.content = in.readUTF();
		}

		@Override
		public int compareTo(TextPair o) {
			// TODO Auto-generated method stub
			return 0;
		}
		
		
	}


转载于:https://www.cnblogs.com/leeeee/p/7276277.html

1.简述HADOOP 的组成以及各节点的作用。 2.简述 MAP-REDUCE的原理 3.2NN是NN的热备吗?还有其他作用吗?请说明 4.简述Hadoop的副本设置策略 5fsimage和edits文件分别存的是什么内容?主要用来于什么?这些文件会存放业务数据吗? 6.Hive和其他数据库的区别,离线和在线的区别 7.创建一个以month_id,day_id为分区的内部SC,字段为ID,类型为字符,要求以竖线分割,month_id为静态分区,day_id为动态分区 8.sc以 select方式覆盖插入三条数据,month_id为静态分区,值为202107,day_id 为动态分区,值为01,02,03,结果如下 ID,MONTH_ID,DAY ID 1 202107 01 2 202107 02 3 202107 03 写出 hql语句 9.Overwrite 和into 的区别是什么? 10.Hive默认是否允许全部设置为动态分区,并指出采用默认设置的理由,如果主分区为动态分区,子分区为静态分区会产生什么问题?请写出设置全部分区为动态分区的参数(5分) 11.从linux主机向hive数仓的SC(sid,cid,score)导入一个SC.TXT的文件,在 hdfs 新建一个/test的目录,从本地向hdfs上传一个SC.TXT文件,然后导入hive数仓的SC,再从hdfs把SC.TXT文件拉到linux主机,分别写出执行语句 12、分桶与分区的区别,指出分桶的理由 13.Order by 和 sort by、distribute by、partitionby的区别,请指出各自适用的场景和用法 14.列出hive常用的存储格式和压缩格式并说明其特点(5分) 15、将一个hive 脚本挂到后台,该脚本可以动态创建日志的目录,并将脚本自定义日志定向到该目录下。写出示例脚本。(5分) 16.写出hive 脚本从测试、挂后台和定时调度、日志监控、杀job所用到的全部语 17、怎么査看hive在 hdfs的存储路径,并查看某个分区占用的空间 18、控制 map数量需要遵循两个原则是什么? 19、如果在hive 中使用了orderby,那么MR会产生多少个ruduce?为什么? 20、请简述数据倾斜产生的原因及解决办法。
最新发布
08-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值