Mapper:
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));
}
}
还原剂:
四个形式类型参数用于指定输入和输出类型,这归约函数的时间。归约函数的输入类型必须与映射函数的输出类型匹配:文本和可写
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));
}
}
但在此示例中,从未使用过密钥。
映射器中的密钥有什么用,根本没有使用过?
为什么密钥是可长时间的?
此示例中使用的输入格式是 TextInputFormat,它将键/值对生成为LongWritable/Text
。
这里的键LongWritable
表示从给定输入文件的Input Split
读取的当前行的偏移位置。其中Text
表示实际的当前行本身。
我们不能说 LongWritable
键为文件中的每一行给出的这个行偏移值没有用。这取决于用例,根据您的情况,此输入键并不重要。
其中,除了TextInputFormat
之外,我们还有许多类型的InputFormat
类型,它以不同的方式解析输入文件中的行并生成其相关的键/值对。
例如 KeyValueTextInputFormat 是 TextInputFormat
的一个子类,它使用配置delimiter
解析每一行,并生成键/值作为Text/Text
。
编辑:-在下面找到一些输入格式和键/值类型的列表,
KeyValueTextInputFormat Text/Text
NLineInputFormat LongWritable/Text
FixedLengthInputFormat LongWritable/BytesWritable
除此之外,我们很少有输入格式在声明时采用基于泛型的自定义键/值类型。比如SequenceFileInputFormat, CombineFileInputFormat
.请查看Hadoop权威指南中的输入格式章节。
希望这有帮助。
如果未设置 JobConf 类将返回 LongWwrite 作为默认类
job.setMapOutputValueClass(...)
在工作会议代码中:-
public Class<?> getOutputKeyClass() {
return getClass(JobContext.OUTPUT_KEY_CLASS,
LongWritable.class, Object.class);
}