Mapreduce中Text类型数据被无缘无故替换?
今天偶然看到一个mapreduce demo,直接上手操作
统计两个文件中 最大值
文件中数据格式为 名字 数值
输出为 名字(最大值所对应的名字) 最大值 例如:豪玉 2201
一通编码,但是居然出现如下的结果
赶紧去查看了代码,如下
map阶段就是找出两个文件中各自的最大值
//map阶段
protected void map(LongWritable key,Text value,Context context) throws IOException,
InterruptedException {
// 抛弃无效记录
String [] line = value.toString().split(" ");
// 把line转换为数值
long temp = Long.parseLong(line[1]);
// 比较大小
if (temp >= max) {
name1 = line[0];
// 把val赋值给tempMax
max = temp;
}
}
protected void cleanup(Context context) throws IOException, InterruptedException {
maxValue.set(max);
name.set(name1);
context.write(name,maxValue);
}
reduce阶段再进行一次比较
//reduce阶段如下
private Long max = Long.MIN_VALUE;
private Text mname = new Text();
private String name;
private Text name2 = new Text();
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException
{
for(LongWritable value : values){
System.out.println(key+value.toString());
if (value.get()>=max)
{
System.out.println("此时的最大值"+value.get());
name2 = key;
max = value.get();
}
}
}
protected void cleanup(Context context) throws IOException, InterruptedException {
// 设置最大值
LongWritable maxValue = new LongWritable();
maxValue.set(max);
mname.set(name2);
context.write(mname,maxValue);
}
于是开始无脑输出测试
先测试了进入reduce端的数据,无误
测试进入reduce端 if判断中的数据,无误
???
一通改,无果
偶然将 reduce 赋值语句用String类型赋值,发现结果无误
name = key.toString();
进而开始找寻原因,原来是Text类型赋值的时候需要实例化
name2 = new Text(key);
赋值修改如上,经测试无误