整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

7.2.4. 多个输入

hadoop 花牛 140℃ 0评论

虽然一个MapReduce作业的输入可能包含多个输入文件(由文件glob、过滤器和路径组成),但所有文件都由同一个InputFormat和同一个Mapper来解释。然而,数据格式往往会随时间演变,所以必须写自己的mapper来处理应用中的遗留数据格式问题。或者,有些数据源会提供相同的数据,但是格式不同。对不同的数据集进行连接(join,也称“联接”)操作时,便会产生这样的问题。详情参见8.2.2节。例如,有些数据可能是使用制表符分隔的文本文件,另一些可能是二进制的顺序文件。即使它们格式相同, 它们的表示也可能不同,因此需要分别进行解析。

这些问题可以用Multiplelnputs类来妥善处理,它允许为每条输入路径指定InputFormatMapper。例如,我们想把英国Met Office的气象数据和NCDC的气象数据放在一起来分析最高气温,则可以按照下面的方式来设置输入路径:

Multiplelnputs.addInputPath(job,ncdcInputPath, TextInputFormat.class,MaxTemperatureMapper.class);

MultipieInputs.addInputPath(job,metofficelnputPath, TextInputFormat.class,MetofficeMaxTemperatureMapper.class);

这段代码取代了对 FilelnputFormat.addlnputPath()和job.setMapperClass()的常规调用。Met OfficeNCDC的数据都是文本文件,所以对两者都使用TextlnputFormat数据类型。但这两个数据源的行格式不同,所以我们使用了两个不一样的mapperMaxTemperatureMapper读取NCDC的输入数据并抽取年份和气温字段的值。MetOfficeMaxTemperatureMapper'读取 Met Office的输入数据,抽取年份和气温字段的值。重要的是两个mapper的输出类型一样,因此,reducer看到的是聚集后的map输出,并不知道这些输入是由不同的mapper产生的。

Multiplelnputs类有一个重载版本的addInputPath()方法,它没有mapper参数:

public static void addInputPath(Job job,Path path,class<? extends InputFormat> inputFormatClass)

如果有多种输入格式而只有一个mapper(通过]obsetMapperClass()方法设定),这种方法很有用。

转载请注明:全栈大数据 » 7.2.4. 多个输入

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址