我是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月12日共发生了3起事件。 就像会有一组日期和事件。
最后我应该表明,有这样的行动&#34;在日期&#34;日期&#34;。 2013年12月12日有3个行动 等....
我怎样才能做到这一点? 任何帮助将不胜感激。!
答案 0 :(得分: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';