标签:
一:背景
RecordReader表示以怎样的方式从分片中读取一条记录,每读取一条记录都会调用RecordReader类,系统默认的RecordReader是LineRecordReader,它是TextInputFormat对应的RecordReader;而SequenceFileInputFormat对应的RecordReader是SequenceFileRecordReader。LineRecordReader是每行的偏移量作为读入map的key,每行的内容作为读入map的value。很多时候hadoop内置的RecordReader并不能满足我们的需求,比如我们在读取记录的时候,希望Map读入的Key值不是偏移量而是行号或者是文件名,这时候就需要我们自定义RecordReader。
二:技术实现
(1):继承抽象类RecordReader,实现RecordReader的一个实例。
(2):实现自定义InputFormat类,重写InputFormat中的CreateRecordReader()方法,返回值是自定义的RecordReader实例。
(3):配置job.setInputFormatClass()为自定义的InputFormat实例。
#需求:统计data文件中奇数行和偶数行的和:
实现代码如下:
MyRecordReader.java:
MyInputFormat.java
MyPartitioner.java
主类 RecordReaderTest.java
程序运行结果:
注:分区数大于2的MR程序要打成jar包才能运行!
标签:
原文地址:http://www.cnblogs.com/thinkpad/p/5173752.html