2

我对 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);
}

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

键:日期

价值:发生的事情。

就像是

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

在 2013 年 12 月 3 日这一天总共发生了 3 件事情。就像会有一组日期和事件。

最后我应该显示,在“日期”日期有“这个数量的行动”。在 2013 年 3 月 12 日等日期有 3 项行动......

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

4

1 回答 1

0

不确定这是否是直接答案,但我不会将聚合与输出一起存储。考虑 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';
于 2013-06-01T02:31:31.690 回答