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

MultipleOutputFormat在Reduce步骤中只执行一次迭代

羊新翰
2023-03-14

这是我的减速器。Reducer具有可边写和可空写功能

EdgeWritable有4个整数,例如<71,74,7,2000>通信在71(FromID)到74(ToID)on 7(7月)2000(Year)之间。

映射器输出10787条记录到reducer,但reducer只输出1条。

我需要输出44个文件与44个月之间的时期从1998年10月至2002年7月。输出的格式应该是“out”+month+year。例如,2002年7月的记录将在文件out7.

我已经调试了代码。在一次迭代之后,它输出一个文件并停止,而不获取下一个记录。请建议我应该如何使用MultipleOutput。谢谢

public class MultipleOutputReducer extends Reducer<EdgeWritable, NullWritable, IntWritable, IntWritable>{
private MultipleOutputs<IntWritable,IntWritable> multipleOutputs;

protected void setup(Context context) throws IOException, InterruptedException{
    multipleOutputs = new MultipleOutputs<IntWritable, IntWritable>(context);

}
    //if(year >= 1997 && year <= 2001){
        if((month >= 9 && year >= 1997) || (month <= 6 && year <= 2001)){

            multipleOutputs.write(new IntWritable(from), new IntWritable(to), "out"+month+year );
        }
    //}

}
@Override
public void cleanup(Context context) throws IOException, InterruptedException{
    multipleOutputs.close();
}
public class TimeSlicingDriver extends Configured implements Tool{

static final SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
public int run(String[] args) throws Exception {


    if(args.length != 2){
        System.out.println("Enter <input path> <output path>");
        System.exit(-1);
    }

    Configuration setup = new Configuration();
    //setup.set("Input Path", args[0]);
    Job job = new Job(setup, "Time Slicing");
    //job.setJobName("Time Slicing");
    job.setJarByClass(TimeSlicingDriver.class);

    job.setMapperClass(TimeSlicingMapper.class);
    job.setReducerClass(MultipleOutputReducer.class);

    //MultipleOutputs.addNamedOutput(setup, "output", org.apache.hadoop.mapred.TextOutputFormat.class, EdgeWritable.class, NullWritable.class);


    job.setMapOutputKeyClass(EdgeWritable.class);
    job.setMapOutputValueClass(NullWritable.class);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(IntWritable.class);

    /**Set the Input File Path and output file path*/
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));



    return job.waitForCompletion(true)?0:1;
}

共有1个答案

李意致
2023-03-14

您没有迭代您的迭代器“val”,因此,您的代码中的逻辑将为每个组执行一次。

 类似资料:
  • 我正在学习angularjs,作为一个测试项目,我正在轮询一个返回活动进程列表(它们的pid)并显示这些进程的服务器。 客户端代码如下所示: 这适用于Firefox和Chrome,但不太适用于Internet Explorer 11。 所有浏览器每秒都执行ReloadData方法,但IE11实际上并不从服务器获取流程数据。Firefox和Chrome确实每秒都会获取数据。我也可以在服务器的输出中看

  • 问题内容: 该脚本未遍历“模块”数组的所有值。 这是运行的结果。该数组显示4个元素,但是.each黑色中的代码仅执行一次。 正在运行:打印消息[Module @ 71f09325,Module @ e1ddb41,Module @ 7069a674,Module @ 1f68f952]正在 运行:打印消息模块名称::::: puppetlabs-ntp正在 运行:打印消息安装非自定义正在 运行:工

  • 根据spring batch中的某些条件,是否可以执行一个步骤或跳过它并继续下一步。例如,批处理作业中有5个步骤,在执行每个步骤之前,我们需要根据数据库中某个列的值检查是否跳过它。需求是通过监听器或其他方式创建通用逻辑,以控制运行时的步骤执行? 我需要在运行时填充下一个属性。示例xml: 但它引发了异常:配置问题:元素[step2]无法访问| 我认为spring不允许在运行时绑定下一个属性。请给出

  • 问题内容: 我正在尝试使用jaxb- maven插件使用JAXB将多个XSD转换为不同包中的POJO。我已将其设置为使用多个执行块,然后执行第一个执行块,然后出现一条消息:模式或绑定文件中未检测到更改 这是我pom.xml的摘录: 这是我收到的错误消息: 如果我交换执行块,则第一个总是执行,其余两个块得到相同的消息。 关于如何解决这个问题的任何想法? 问题答案: 通过升级到版本1.6进行了修复 和

  • 作为测试的一部分,我想多次执行一组测试方法。< br >我使用TestNG来指定我的测试。我在testng.xml文件中指定的测试如下: 执行此测试后,我看到重复的方法没有被执行。它只执行测试直到“更改位置”。任何人都可以提出任何其他解决方案或原因,为什么这不起作用? 请注意,我不想使用不同的数据集多次执行这些方法。因此,按照我在网上找到的几篇帖子中的建议使用数据提供者对我没有帮助。因为我遵循严格