Class 为什么我们需要在Hadoop程序中显式设置输出键/值类?

Class 为什么我们需要在Hadoop程序中显式设置输出键/值类?,class,input,hadoop,Class,Input,Hadoop,在《Hadoop:权威指南》一书中,有一个示例程序,其代码如下 JobConf conf = new JobConf(MaxTemperature.class); conf.setJobName("Max temperature"); FileInputFormat.addInputPath(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); conf.setMapp

在《Hadoop:权威指南》一书中,有一个示例程序,其代码如下

JobConf conf = new JobConf(MaxTemperature.class);  
conf.setJobName("Max temperature");  
FileInputFormat.addInputPath(conf, new Path(args[0]));  
FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
conf.setMapperClass(MaxTemperatureMapper.class);  
conf.setReducerClass(MaxTemperatureReducer.class);  
conf.setOutputKeyClass(Text.class);  
conf.setOutputValueClass(IntWritable.class);  

MR框架应该能够从Mapper和在JobConf类上设置的Reduce函数中找出输出键和值类。为什么我们需要在JobConf类上显式设置输出键和值类?此外,输入键/值对没有类似的API。

原因是类型擦除[1]。将输出K/V类设置为泛型。在作业设置期间(运行时,而不是编译时),这些泛型将被擦除

可以从输入文件中读取输入k/v类,对于SequenceFile,这些类位于标题中-您可以在编辑器中打开序列文件时读取它们。 必须写入此标头,因为每个映射输出都是SequenceFile,所以需要提供类

[1]