当前位置: 首页 > 知识库问答 >
问题:

我的MapReduce程序出错了,我想在那里收集多年来的最高温度

唐元凯
2023-03-14

当我编译hadoop命令时,它最终出现以下错误:“java.io.ioException:Type mismatch in key from map:expected org.apache.hadoop.io.text,received org.apache.hadoop.io.longwritable”

我将数据类型从Text更改为LongWritable,在这种情况下,我会得到其他数据类型不匹配。

主类:

public class CalculateMaximum {
    public static void main(String [] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException{

    Configuration config  = new Configuration();
    Job job = new Job(config);
    job.setJarByClass(CalculateMaximum.class);
    job.setMapperClass(CalculateMapper.class);
    job.setNumReduceTasks(1);
    job.setReducerClass(CalReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    FileSystem fs = FileSystem.get(config);
    fs.delete(new Path(args[1]));
    job.waitForCompletion(true);
}
}

映射器类:

public class CalculateMapper extends Mapper<LongWritable,Text,Text,IntWritable> {

    public void cal(LongWritable key,Text values,Context context) throws IOException, InterruptedException{
        String row = values.toString();
        String []r1 = row.split(" ");

        //Integer year = Integer.parseInt(row[0]);
        Text yr  = new Text(r1[0]);
        Integer temp = Integer.parseInt(r1[1]);
        IntWritable tp = new IntWritable(temp);
        context.write(yr, tp);
        //context.write(yr, tp);


    }
}

减速器类:

public class CalReducer extends Reducer<Text,Iterable<IntWritable>,Text,IntWritable> {

    public void cal(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{

        //Iterable<IntWritable> tmps = values;

        //int temp  = tmps.get();

        int max = 0;
        for(IntWritable temp : values){
            if(temp.get() > max){
                max= temp.get();
            }
        context.write(key, new IntWritable(max));   

        }
            }
}
1900 39
1900 14
1900 5
1900 11
1901 32
1901 40
1901 29
1901 48
1900 39
1901 48

共有1个答案

柯鸿振
2023-03-14

我相信键和值都是int类型。您能尝试使用IntWritable for键吗?

 类似资料:
  • 那些年我们错过的响应式编程 > 原文链接 : The introduction to Reactive Programming you've been missing 作者 : @andrestaltz 译者 : yaoqinwei 校对者: bboyfeiyu、chaossss 状态 : 完成 相信你们在学习响应式编程这个新技术的时候都会充满了好奇,特别是它的一些变体,例如:Rx系列、Bacon

  • 我的程序是采取任何类型的文件和打开他们自己。 我已经试过了 我只使用文件获得正确的数据。

  • 问题内容: 这是我第一次真正使用列表和队列,因此这可能是一个非常简单的错误。是否因为我的队列中充满了无法转换为整数的对象? 问题答案: 除非您确实对性能至关重要,并且您使用了许多像int这样的原子类型,否则您确实应该使用Generics和ArrayList / ArrayDeque。然后,您应该看看 http://labs.carrotsearch.com/hppc.html

  • 问题内容: 我正在编写一个Java程序,该程序读取一个单词文件。程序至关重要地依赖于此文件,因此,无论出于何种原因,在读取文件时都出现IOException,我确实希望程序结束。 结束程序的最佳方法是什么?我认为我被迫将文件读取包围在try / catch块中,因此我应该在catch中添加一个内部吗?例如,我应该做以下事情吗? 问题答案: 如果让异常一直传播到方法,程序将结束。无需调用,只需允许异

  • 程序描述:人们使用jsliders输入用户分数,然后在游戏结束时点击按钮检查分数,它会告诉你谁得了第一、第二、第三等分数。 我不确定的是如何让程序告诉我得分最高的球员姓名。我把它分类了,它告诉你实际的分数,只是没有名字。 我基本上是在寻找: 代码:

  • 我已经更改了我的应用程序的名称,一切都很好。在我的主屏幕或设置中,它显示得很好,但是当我按multitab时,在手机上显示所有正在运行的应用程序的那个,我没有看到我的应用程序名称,而是我的项目名称。或者至少我认为这是这样。这是我的应用程序图标在主屏幕图标的照片,这是打开多选项卡时显示的方式