映射器:
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?
答案 0 :(得分:3)
此示例中使用的输入格式为TextInputFormat,它将键/值对生成为LongWritable/Text
。
此处,键LongWritable
表示从给定输入文件的Input Split
读取的当前行的偏移位置。 Text
表示实际当前行本身的位置。
我们不能说文件中每行的LongWritable
键给出的行偏移值没有用。这取决于用例,根据您的情况,此输入键不重要。
我们有多种类型的InputFormat
类型而不是TextInputFormat
,它们以不同的方式解析输入文件中的行并生成相关的键/值对。
例如KeyValueTextInputFormat是TextInputFormat
的子类,它使用配置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);
}