Hadoop数据类型–MapReduce的输入
1、Writable和WritableComparable接口
Writable含write()和readFileds()两方法,当数据在网络上传输或从硬盘读写时,提供数据的序列化和反序列化机制,所有用作mapper/reducer输入输出值的类型都须实现(v1/v2/v3),用作键的k1,k2,k3还需实现Comparable接口
2、wrapper类
(1)原始包装类:Boolean/Byte/Double/Float/Int/Long/VInt/VLong+Writable
(2)数组包装类:Array/TwoDArray+Writable
(3)Map包装类:MapWritable/AbstarctMapWritable/SortedMapWritable
例:
BoolenWritable b1=new BooleanWritable(true);
IntWritable i1=new IntWritable(1);
ArrayWritable a1=new ArrayWritable(IntWritable.class);
NullWritable n1=NullWritable.get();
3、InputFormat和RecordReader
InputFormat类的功能:(1)将输入文件切分成map处理所需的split;
(2)创建RecordReader,从一个split生成键值对。
RecordReader:调用getNextKeyValue()并返回一个布尔值指明下一个键值对是否可用
组合使用InputFormat和RecordReader可以将许多类型的I/O转为MapReduce所需的键值对
4、当输入文件明显小于HDFS的块容量时,会出现小文件问题,可以:
(1)在存储文件和执行作业前,先执行预处理步骤,SequenceFile(序列文件)和TFile格式
(2)使用CombineFileInputFormat将多个小文件合并到一个InputSplit中
public class TestCombineFileInputFormat extends CombineFileInputFormat<LongWritable,Text>{
@Override
public RecordReader<LongWritable,Text> {
createRecordReader(InputSplit inputsplit,TaskAttemptContext taskAttemptContext)throws Exception{
return new (CombineFileSplit)inputsplit,taskAttemptContext,TestCombineFileRecordReader.class);
}
}
}
在驱动程序和mapper中设置InputFormat:job.setInputFormatClass(TestCombineFileInputFormat.class);
5、输入过滤
实现过滤时需要拓展Configured类,实现PathFilter接口,在驱动类中,告诉作业过滤器的存在:
FileInputFormat.setInputPathFilter(job,TestFilter.class);