关于Mapreduce Text类型赋值的错误

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端的数据

测试进入reduce端 if判断中的数据,无误

if中的判断

???

一通改,无果

偶然将 reduce 赋值语句用String类型赋值,发现结果无误

name = key.toString();
运行结果

进而开始找寻原因,原来是Text类型赋值的时候需要实例化

name2 = new Text(key);

赋值修改如上,经测试无误

posted @ 2021-04-28 19:52  xppp11  阅读(172)  评论(0编辑  收藏  举报