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

Hadoop Reducer不工作

华瀚漠
2023-03-14

我在使用MapReduce作业时遇到了问题。我的map函数确实运行并产生了所需的输出。但是,duce函数没有运行。该函数似乎从未被调用过。我使用Text作为键,Text作为值。但我不认为这会导致问题。

输入文件的格式如下:

2015-06-06,2015-06-06,40.80239868164062,-73.93379211425781,40.72591781616211,-73.98358154296875,7.71,35.72
2015-06-06,2015-06-06,40.71020126342773,-73.96302032470703,40.72967529296875,-74.00226593017578,3.11,2.19
2015-06-05,2015-06-05,40.68404388427734,-73.97597503662109,40.67932510375977,-73.95581817626953,1.13,1.29
...

我想将一行的第二个日期提取为<code>Text<code>并将其用作reduce的键。键的值将是同一行中最后两个<code>float<code>值的组合
即:2015-06-06 7.71 35.72 2015-06-06 9.71 66.72
以便可以将值部分视为由空白分隔的两列
这实际上是可行的,我得到了一个输出文件,其中包含许多相同的键,但值不同。

现在我想对每个键的两个浮点列求和,以便在减少之后,我得到一个日期作为键,并将汇总列作为值。

问题:减少不运行。

请参阅下面的代码:

制图员

public class Aggregate {

public static class EarnDistMapper extends Mapper<Object, Text, Text, Text> {

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

        String [] splitResult = value.toString().split(",");
        String dropOffDate = "";
        String compEarningDist = "";
        //dropoffDate at pos 1 as key 
        dropOffDate = splitResult[1];
        //distance at pos length-2 and earnings at pos length-1 as values separated by space
        compEarningDist = splitResult[splitResult.length -2] + " " + splitResult[splitResult.length-1];

        context.write(new Text(dropOffDate), new Text(compEarningDist));
    }
}

减速机

public static class EarnDistReducer extends Reducer<Text,Text,Text,Text> {

    public void reduce(Text key, Iterator<Text> values, Context context) throws IOException, InterruptedException {

         float sumDistance = 0;
         float sumEarnings = 0;
         String[] splitArray; 

         while (values.hasNext()){
             splitArray = values.next().toString().split("\\s+");
             //distance first
             sumDistance += Float.parseFloat(splitArray[0]);
             sumEarnings += Float.parseFloat(splitArray[1]);
         }

         //combine result to text

         context.write(key, new Text(Float.toString(sumDistance) + " " + Float.toString(sumEarnings)));
    }
}

职位

public static void main(String[] args) throws Exception{
    // TODO
    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf, "Taxi dropoff");
    job.setJarByClass(Aggregate.class);
    job.setMapperClass(EarnDistMapper.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);
    job.setCombinerClass(EarnDistReducer.class);
    job.setReducerClass(EarnDistReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

谢谢你的帮助!!

共有1个答案

方韬
2023-03-14

您有减少方法的签名错误。你有:

public void reduce(Text key, Iterator<Text> values, Context context) {

应该是:

public void reduce(Text key, Iterable<Text> values, Context context) {
 类似资料:
  • 我想在菜单栏文本被选中时更改它的颜色。 这里可能出了什么问题? 我尝试使用伪类':active',但没有得到应用。其中as':Hover'正在工作。 我还尝试使用'Router LinkActive',它应该添加类'Active-Link',但这也不起作用。 我在下面给出了HTML、SCCS和TS代码:

  • 我编写了一组简单的类,向一位朋友演示如何为AOP(而不是xml配置)使用注释。我们无法使@ComponentScan工作,并且AnnotationConfigApplicationContext getBean的行为也不正常。我想明白两件事。请参阅下面的代码: PersonOperationSI.java PersonOperations.java PersonOperationsConfigCl

  • 我正在Eclipse Neon中使用Hibernate工具(JBoss tools 4.4.0.Final)。现在,我想将数据库表反向工程为POJO对象和Hibernate映射文件。 我遵循了一些关于如何设置Eclipse来生成POJO对象的教程。在我运行配置之前,一切看起来都很好。什么都没发生,也没有抛出错误。有人能帮我吗?数据库是一个微软SQL服务器2014。 我的逆向工程配置文件看起来像:

  • 我正在尝试使用codeigniter insert\u batch将多行插入到我的数据库表中。根据错误报告,似乎没有设置表列。只是阵列的数量: 我的看法是: 我的控制器: 和型号:

  • 我尝试使用StreamWriter.WriteLine(不是静态地)将几行代码一次写到。txt文件中。 每个播放器对象都是字符串cosnatants。如果我使用不同的文件名(也称为BasicTestInfo2.txt),它会在bin.debug中创建该文件,但它是空的。我知道我到达了using块的内部(我在里面放了一个console.writeline),我知道我想要截断,这就是为什么我对appe

  • 我正在尝试使用yii2邮件组件发送电子邮件。 配置web。php 还有我的代码。 我收到了这个错误。 Swift\u TransportException预期响应代码为250,但收到代码“535”,消息“535-5.7.8用户名和密码不被接受。有关详细信息,请访问535 5.7.8https://support.google.com/mail/?p=BadCredentialsa13-v6sm41

  • 问题内容: 似乎不起作用,但确实起作用。有什么想法吗? 问题答案: 您不能在Java中将基本类型用作通用参数。改为使用: 使用自动装箱/拆箱,代码几乎没有区别。自动装箱意味着您可以编写: 代替: 自动装箱意味着将第一个版本隐式转换为第二个版本。自动拆箱意味着您可以编写: 代替: 如果未找到键,则隐式调用意味着将生成一个,例如: 原因是类型擦除。例如,与C#不同,泛型类型不会在运行时保留。它们只是显