无法在运行时确定Hadoop MapReduce的输出数据类型?

无法在运行时确定Hadoop MapReduce的输出数据类型?,hadoop,serialization,mapreduce,type-erasure,generics,Hadoop,Serialization,Mapreduce,Type Erasure,Generics,Hadoop框架需要知道映射器和Reducer的输出数据类型,以便在运行时创建这些类型的实例,以在映射器和Reducer之间以及在将实例从Reducer序列化到输出文件期间反序列化值。因此,我们必须告诉Hadoop框架关于作业对象中的输出数据,如 job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); job.setOutputKeyClass(NullWr

Hadoop框架需要知道映射器和Reducer的输出数据类型,以便在运行时创建这些类型的实例,以在映射器和Reducer之间以及在将实例从Reducer序列化到输出文件期间反序列化值。因此,我们必须告诉Hadoop框架关于作业对象中的输出数据,如

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);

It is not possible to infer the types at runtime from the class definitions of the Mapper and Reducer since Java Generics uses Type Erasure.
假设这是一个映射器类

public static class SelectClauseMapper
    extends Mapper<LongWritable, Text, NullWritable, Text> {

    public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {
        if(!AirlineDataUtils.isHeader(value)){
            StringBuilder output = AirlineDataUtils.mergeStringArray(
                AirlineDataUtils.getSelectResultsPerRow(value),
                ",");
                context.write(NullWritable.get(),new Text(output.toString()));
        }
    }
公共静态类SelectClauseMapper
扩展映射器{
公共void映射(可长写键、文本值、上下文)
抛出IOException、InterruptedException{
如果(!AirlineDataUtils.isHeader(值)){
StringBuilder输出=AirlineDataUtils.mergeStringArray(
AirlineDataUtils.getSelectResultsPerRow(值),
",");
write(nullwriteable.get(),新文本(output.toString());
}
}
有人能在上面的例子中解释一下为什么不能在运行时确定输出类型吗