hadoop输入和输出格式

时间:2021-07-20 18:20:34
1.TextInputformat 
      TextInputformat是默认的inputformat,对于输入文件,文件中每一行作为一个记录,他将每一行在文件中的起始偏移量作为key,每一行的内容作为value。为什么不用行数作为key呢? 
      注意split中只是保存了split在文件中的位置,map操作读取数据的时候还是会到HDFS中打开原始文件,然后定位到split所需的数据的位置。 
      所以在处理split的时候,打开文件后定位到split所在的位置,但是我们不知道这个split的第一个记录处在文件的第几行,我们也无法知道上一个split中存了多少行数据,所以不能确定这个记录是文件中的第几行。 
      然而我们会定位到split时我们可以获得第一个记录的偏移量,所以TextInputformat是以行的偏移量作为key。 
2. key-value TextInputformat 
    当输入数据的每一行是两列,并用tab分离的形式的时候,key-valueTextInputformat处理这种格式的文件非常适合。 

3.NLineInputformat 
NLineInputformat可以控制在每个split中数据的行数。 

4.SequenceFileInputformat 
      当输入文件格式是sequencefile的时候,要使用SequenceFileInputformat。由于sequencefile都是以key和value的二进制形式存放的(注意hadoop类型的二进制的解释方式和原始二进制不一样,会多一些维护信息),所以这种情况下map的key和value的类型是由sequencefile决定的,所以必须保证map的输入类型与sequencefile一致。比如sequencefile中的内容key的类型是intwritable,value的类型是Text,那么在map的类型也必须是这两个。 

5.sequencefileAsTextInputF ormat 
      sequencefileAsTextInputF ormat将sequencefile的key和value都转化成Text对象传入map中。 

6.sequencefileAsBinaryInpu tFormat 
      他将sequencefile中的key和value都以原始二进制的形式封装在byteswritable对象中传给map,如何对二进制数据进行解释是map函数编写者的工作。 

7.复合输入 
      MapReduce的输入格式可能不只一种,这时可以使用MutipleInputs来多次添加路径并制定输入格式。 

输出格式: 
1.TextOutputformat 
      默认的输出格式,key和value中间值用tab隔开的。 

2.SequenceFileOutputformat  
    将key和value以sequencefile格式输出。 

3.sequencefileAsOutputForm at 
    将key和value以原始二进制的格式输出。 

4.MapFileOutputFormat 
    将key和value写入MapFile中。由于MapFile中的key是有序的,所以写入的时候必须保证记录是按key值顺序写入的。 

5.MultipleOutputFormat 
      默认情况下一个reducer会产生一个输出,但是有些时候我们想一个reducer产生多个输出,MultipleOutputFormat和MultipleOutputs可以实现这个功能。 

MultipleOutputFormat允许reducer将输出写入多个文件,写入那个文件是由key和value决定的。MultipleOutputFormat提供了一些方法可以控制reducer输出目标文件的名字。MultipleOutputFormat是MultipleTextOutputFormat 和MultipleSequenceOutputFo rmat两个类的父类。 

      例如可以写一个类,继承自MultipleTextOutputFormat 并复写他的generateFileNameForKeyVa lue方法控制reduce输出目标的文件名。程序运行的时候不同的reducer输出结果的时候调用这个方法,这个方法根据要输出记录的信息产生文件名,reducer将数据写入相应文件中,这样就能是一个reducer向多个文件写入。利用这个特性我们就可以方便的进行结果的聚类了。 
6. MultipleOutputs 
MultipleOutputFormat实际上是在reduce输出结果的时候指定文件名来实现多文件输出,而MultipleOutputs是在job指定的output基础上,新增额外的输出,他才是真正意义上的多文件输出。 

MultipleOutputs分为两种情况: 

·附加单个文件输出。有些时候我们在原有的结果输出基础上,还想输出一些其他的信息,这是就可以调用MultipleOutputs的addNamedOutput方法,并且outputformat格式及keyvalue类型都可以自定义的。 
·附加多个文件: 
调用MultipleOutputs的addMultiNameOutput方法可以附加多个文件,利用这个方法可以实现多文件分类输出。