MapperReduce中两个不同文件夹下读取数据并连接

MapperReduce中两个不同文件夹下读取数据并连接

前言

今天是20200202,我觉得是疫情的拐点,是一个编程的好日子!过去不学技术的一年,可能要白给,不管怎么说,好歹我也认识到马克思哲学理论的确实是科学的,矫情的话能写一大堆,好想聊聊天啊。不管了干正事,第一次写这个笔记,因为好多东西忘记的太快了,也是受广学楼某人的耳闻目染,当个笔记本记录一下,不知道CSDN能不能写个人编程日记,写错了大家指出来哈,好多不会,太多要学!

问题抛出

  1. 在MapperReduce中很常见的需求就是对表做链接操作,当然hive很方便,那怎么使用MR实现
  2. 首先两个表,在这里是来自HDFS上两个不同文件夹下的文件,所以要解决如何区分是来自两个文件夹中那个文件夹下的数据
  3. 最后怎么在Reduce端如何做链接操作

问题解决

  1. 在Reduce端都是通过打的不同标签来区分数据是来自那个文件夹的
  2. 在Mapper中打标签,有两种方案第一种是,写两个Mapper类,第二个是通过切片判断文件路径,我觉得第一个方便一点,注意如果是两个Mapper类,如果输出的K,V数据格式不统一可能会报错,建议都是用Text,反正可以格式转换
  3. 连接操作,首先将数据通过标签放在两个集合里,然后在通过两次遍历做连接

使用两个Mapper类

案例来自2019安徽省大数据与人工智能竞赛
将输出结果文件中的城市编号用cityid.txt文件中城市名称替换

结果文件test2中的数据,需要将cityid字段中的编号替换为下图中的汉字
需要将cityid字段中的编号替换为下图中的汉字
cityid.txt中的文件内容部分数据格式如下

1701|桐城市|桐城市|安徽|中国|安庆市|华东地区|四线城市|31.05228|116.93861
1702|宿松县|宿松县|安徽|中国|安庆市|华东地区|四线城市|30.151213|116.1142
1703|枞阳县|枞阳县|安徽|中国|安庆市|华东地区|四线城市|30.69371|117.21059
1704|太湖县|太湖县|安徽|中国|安庆市|华东地区|四线城市|30.420059|116.26508
1705|怀宁县|怀宁县|安徽|中国|安庆市|华东地区|四线城市|30.409006|116.64709
1706|岳西县|岳西县|安徽|中国|安庆市|华东地区|四线城市|30.857161|116.35818
1707|望江县|望江县|安徽|中国|安庆市|华东地区|四线城市|30.123537|116.67433
1708|潜山县|潜山县|安徽|中国|安庆市|华东地区|四线城市|30.630346|116.5672
5317|迎江区|迎江区|安徽|中国|安庆市|华东地区|四线城市|30.511548|117.09115
5318|大观区|大观区|安徽|中国|安庆市|华东地区|四线城市|30.553957|117.02167
1691|怀远县|怀远县|安徽|中国|蚌埠市|华东地区|四线城市|32.95665|117.19356
1692|固镇县|固镇县|安徽|中国|蚌埠市|华东地区|四线城市|33.314575|117.31171
1693|五河县|五河县|安徽|中国|蚌埠市|华东地区|四线城市|33.139736|117.88253
1738|和县|和县|安徽|中国|巢湖市|华东地区|null|31.714224|118.36112
1739|含山县|含山县|安徽|中国|巢湖市|华东地区|null|31.720116|118.103
1740|庐江县|庐江县|安徽|中国|巢湖市|华东地区|null|31.253363|117.28835
1741|无为县|无为县|安徽|中国|巢湖市|华东地区|null|31.298515|117.91132

直接上代码了,建议用一个文件写,不要分三个,用静态类写
1. Mapper类

//第一个mapper类,数据打上标签“a_”
public static class doMapper1 extends Mapper<LongWritable, Text, Text, Text> {
   
		private final static String a_label = "a_";

		@Override
		protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
				throws IOException, InterruptedException {
   
			String line = value.toString().trim();
			String[] splits = line.split(" ");
			String[] v = null;
			// 字段为5个处理,否则是脏数据过滤掉
			if (splits.length == 5) {
   
				// 取出cityid
				v = splits[4].split(":")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值