首页 文章

用于减速器功能的一个键的多个输出,Hadoop

提问于
浏览
1

我需要做的是做一些麻烦,就是为一个键输出两个值作为reduce函数的输出 . reduce函数以Id的形式和与该Id相关联的整数列表接收数据 . 它需要输出Id,列表中整数的平均值和列表的长度 .

但是,reduce函数的实现应该具有 OutputCollector <Text, IntWritable> 作为参数,该参数明确地将与每个键相关联的输出的数量限制为1 .

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

Hadoop版本:2.0.0

2 回答

  • 1

    您必须使用MultipleOutputs . 在工作:

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

    在减速机中:

    multipleOutputs.getCollector
    
  • -1

    以下是您模糊问题的一些答案 .

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

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

    要么

    您应该选择不同的值类型V3而不是 IntWritable . 创建 PairOfIntWritable 或使用 ArrayWritable 将任何想要的内容推送到 collect 的单个调用中 . 那么长度和平均值可以是每个键的单个记录的值的"fields" .

    要么

    如果您必须使用 IntWritable ,请使用invertible pairing function将两个整数合并为一个整数 . 您'll need to insure that you can' t超过 IntWritable 的最大值,您可以从输入数据中生成任何可能的对 .

    要么

    使用 MultipleOutputs 将每个记录发送到一个按名称区分的不同文件,因此part-r-nnnnn包含means和length-r-nnnnn包含长度 . MultipleOutputs 上的JavaDoc解释了它的用法 .

相关问题