继承FileInputFormat类和RecordReader类

FileInputFormat是一个处理文件的InputFormat类,当要继承该类时,需要覆盖三个方法:
1.protected boolean isSplitable(JobContext context,Path filename)
判断文件是否可分割,通常是可分割的,以换行符进行分割,但如果文件是压缩的,将不可分割是否分割,可以自行重写FileInputFormat的isSplitable来控制

2.public List<InputSplit> getSplits(JobContext job) throws IOException
getSplits方法会根据输入目录产生InputSplit数组, 每个InputSplit会相应产生一个map任务, map的输入定义在InputSplit中,其中,Split中不包含实际的分片内容,而只是对实际信息的分片信息(即分片的元数据)。具体的说,每个分片中包含当前分片对应的文件路径,当前分片在该文件中起始位置,当前分片的长度以及对应的实际数据所在的节点列表。

3.public RecordReader<K,V> createRecordReader(InputSplit split
,TaskAttemptContext context) throws IOException,InterruptedException

这是InputFormat类的方法,该方法返回RecordReader,来决定如何读取每个分片内容

RecordReader类告诉hadoop以哪种方式从分片中读取一条记录record,每读取一条记录都会调用RecordReader类;系统默认的RecordReader是LineRecordReader,如TextInputFormat;LineRecordReader是用每行的偏移量作为map的key,每行的内容作为map的value;重写该类是要重新定义如何进行读取分片,以什么为key,什么为value
其中比较重要的方法如下:
1.public abstract void initialize(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException;

初始化工作

2.public Text getCurrentKey()
throws IOException,InterruptedException

获取当前的key

3.public BytesWritable getCurrentValue()
throws IOException, InterruptedException

获取当前的value

4.public float getProgress() throws IOException, InterruptedException
获取当前的处理进度

5.public boolean nextKeyValue() throws IOException
读取下一个key/value,返回读取结果

6.public void close() throws IOException
关闭工作

其中context的nextKeyValue、getCurrentKey、getCurrentValue都是该方法封装的
这个RecordReader将在自定义的inputFormat中的createRecordReader方法中返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值