我对Hadoop非常陌生,我编写了一个MapReduce程序,该程序可以解析输入文件并提取特定的模式作为键及其值。
我可以轻松地减少它,最终输出是带有一对键和值的文件。

public class EReducer extends MapReduceBase implements Reducer<Text, Text, Text, Text>
{

    private Text outputKey1 = new Text();
    private Text outputValue1 = new Text();


    public void reduce(Text equipKey1, Iterator<Text> equipValues1,
                    OutputCollector<Text, Text> results1, Reporter reporter1) throws IOException {
            String output1 = "";
  while(equipValues1.hasNext())
            {
                    Text equi= equipValues1.next();
                    output1 = output1 + equi.toString();
            }

                    outputKey1.set(equipKey1.toString());
                    outputValue1.set(output1);
                    results1.collect(outputKey1, outputValue1);
}

问题是,在文件开头,我需要显示键的总数和特定键的合计值的总数。

密钥:日期

值(value):发生的事情。

就像是
12/03/2013 CMB ate pizza
           He went to a mall
           He met his friend

2013年12月3日共发生3件事。
就像将有一组日期和事件。

最后,我应该证明,日期“date”上有“this number of action”。
在2013年12月3日采取了3次操作
等等....

我怎样才能做到这一点?
任何帮助,将不胜感激。!

最佳答案

不知道这是否是直接的答案,但是我不会将聚合与输出一起存储。考虑使用Pig获得聚集体。非常适合此用例。

另外,我不理解“文件开始”问题。一个reducer任务可能有多个键-可以使用的值,因此您的文件“part-r-00000”想要

12/01/2012 something something1 something2
12/02/2012 abc abc1 abc2

但是我倾向于只存储从reducer发出的数据而不进行汇总,而使用Pig运行它们以获取所需的计数(您必须实现udf来解析事件,这很简单)

只是一个可能的片段
a = LOAD '/path/to/mroutput' as (dt:chararray, evdata:chararray);
b = foreach a generate dt, com.something.EVParser(evdata) as numberofevents;
c = store b into '/path/to/aggregateddata';

10-07 23:41