zoukankan      html  css  js  c++  java
  • 关于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);
    

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

    © 版权声明
    文章版权归作者所有,未经允许请勿转载。
    THE END
  • 相关阅读:
    C# 中的委托和事件
    C# 托管资源和非托管资源
    .NET Core 2.0
    PyQt5教程——事件和信号(5)
    PyQt5教程——布局管理(4)
    PyQt5教程——菜单和工具栏(3)
    PyQt5教程——第一个程序(2)
    PyQt5教程——介绍(1)
    如何通过 GitLab 进行在Azure WebApp中持续部署
    如何检测 Azure Web 应用沙盒环境文件系统存储量
  • 原文地址:https://www.cnblogs.com/xp-thebest/p/14715576.html
Copyright © 2011-2022 走看看