为什么LongWritable(key)没有在Mapper类中使用?

时间:2015-09-18 11:24:04

标签: java hadoop mapreduce

映射器:

Mapper类是泛型类型,有四个形式类型参数,用于指定地图函数的输入键,输入值,输出键和输出值类型

public class MaxTemperatureMapper
    extends Mapper<LongWritable, Text, Text, IntWritable> {
        private static final int MISSING = 9999;
        @Override
        public void map(LongWritable key, Text value, Context context)
          throws IOException, InterruptedException {
            String line = value.toString();
            String year = line.substring(15, 19);
            int airTemperature;
            if (line.charAt(87) == '+') { // parseInt doesn't like leading plus signs
                airTemperature = Integer.parseInt(line.substring(88, 92));
            } else {
                airTemperature = Integer.parseInt(line.substring(87, 92));
        }
        String quality = line.substring(92, 93);
        if (airTemperature != MISSING && quality.matches("[01459]")) {
            context.write(new Text(year), new IntWritable(airTemperature));
        }
    }

减速机:

四个形式类型参数用于指定输入和输出类型,这个 减少功能的时间。 reduce函数的输入类型必须与map函数的输出类型匹配:Text和IntWritable

public class MaxTemperatureReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
    public void reduce(Text key, Iterable<IntWritable> values, Context context)
    throws IOException, InterruptedException {
        int maxValue = Integer.MIN_VALUE;
        for (IntWritable value : values) {
            maxValue = Math.max(maxValue, value.get());
        }
    context.write(key, new IntWritable(maxValue));
    }
}

但是在这个例子中,密钥从未使用过。

Mapper 中的密钥有什么用,但根本没用过?

为什么密钥是LongWritable?

2 个答案:

答案 0 :(得分:3)

此示例中使用的输入格式为TextInputFormat,它将键/值对生成为LongWritable/Text

此处,键LongWritable表示从给定输入文件的Input Split读取的当前行的偏移位置。 Text表示实际当前行本身的位置。

我们不能说文件中每行的LongWritable键给出的行偏移值没有用。这取决于用例,根据您的情况,此输入键不重要。

我们有多种类型的InputFormat类型而不是TextInputFormat,它们以不同的方式解析输入文件中的行并生成相关的键/值对。

例如KeyValueTextInputFormatTextInputFormat的子类,它使用配置delimiter解析每一行,并将键/值生成为Text/Text

编辑: - 在下面找到几个输入格式和键/值类型的列表,

KeyValueTextInputFormat  Text/Text

NLineInputFormat         LongWritable/Text

FixedLengthInputFormat   LongWritable/BytesWritable

除了我们有很少的输入格式,它们在声明时采用基于泛型的自定义键/值类型。就像SequenceFileInputFormat, CombineFileInputFormat一样。请查看Hadoop权威指南中的输入格式章节。

希望这有帮助。

答案 1 :(得分:-1)

如果你没有设置

JobConf 类,则返回LongWritable作为默认类

job.setMapOutputValueClass(...)

JobConf 代码中: -

public Class<?> getOutputKeyClass() {
    return getClass(JobContext.OUTPUT_KEY_CLASS,
                    LongWritable.class, Object.class);
}