【问题标题】:Multiple outputs for one key for reducer function, Hadoop一键多输出,用于 ​​reducer 功能,Hadoop
【发布时间】:2014-06-04 19:42:38
【问题描述】:

我需要做并且遇到一些麻烦的是为一个键输出两个值作为我的 reduce 函数的输出。 reduce 函数以 Id 和与该 Id 关联的整数列表的形式接收数据。它需要输出该 ID、列表中整数的平均值以及列表的长度。

但是,reduce 函数的实现应该将 OutputCollector <Text, IntWritable> 作为参数,这清楚地将与每个键关联的输出数量限制为 1。

在这方面的任何帮助将不胜感激。提前致谢。

Hadoop 版本:2.0.0

【问题讨论】:

  • 你的问题措辞太差了,到目前为止你收到的两个答案都不会被认为是错误的,但它们是完全不同的。我可以想到第三种解释,它会导致另一个答案。

标签: java hadoop mapreduce reduce


【解决方案1】:

您必须使用 MultipleOutputs。在工作中:

MultipleOutputs.addMultiNamedOutput(job,
            "Name",
            SequenceFileOutputFormat.class, Text.class,
            Writable.class);

在减速器中:

multipleOutputs.getCollector

【讨论】:

    【解决方案2】:

    这里是对您模糊问题的一些答案。

    如果您不介意混合输出中出现在其自己的记录中的每个数据(长度和平均值),您可以针对同一键多次调用collect()。这可以通过编写不同的键来区分不同的记录类型来实现,如下所示:

    oc.collect( new Text( k.toString() + " mean", mean );
    oc.collect( new Text( k.toString() + " length", length );
    

    您应该选择不同的值类型 V3 而不是 IntWritable。要么创建一个PairOfIntWritable,要么使用ArrayWritable 将你想要的任何东西塞进一个对collect 的调用中。那么长度和平均值可以是每个键的单个记录的值的“字段”。

    如果您绝对必须使用IntWritable,请使用invertible pairing function 将两个整数合二为一。您需要确保您不能超过 IntWritable 的最大值,您可以从输入数据生成任何可能的配对。

    使用MultipleOutputs 将一条记录分别发送到按名称区分的不同文件,例如,part-r-nnnnn 包含均值,length-r-nnnnn 包含长度。 MultipleOutputs 上的 JavaDoc 解释了它的用法。

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2018-08-02
      • 2016-06-16
      • 1970-01-01
      相关资源
      最近更新 更多