2011-04-18 95 views
3

我是HDFS和MapReduce的新手,並試圖計算調查統計。輸入文件的格式如下:年齡點性別類別 - 所有4個都是數字。這是正確的開始:Hadoop和MapReduce

public static class MapClass extends MapReduceBase 
    implements Mapper<IntWritable, IntWritable, IntWritable, IntWritable> { 
    private final static IntWritable Age = new IntWritable(1) ; 
    private IntWritable AgeCount = new IntWritable() ; 

    public void map(Text key, Text value, 
        OutputCollector<IntWritable, IntWritable> output, 
        Reporter reporter) throws IOException { 
     AgeCount. set(Integer. parseInt(value. toString())) ; 
     output. collect(AgeCount, Age) ; 
    } 
} 

我的問題:1。 這是一個正確的開始? 2.如果我想收集像Sex,Points這樣的其他屬性 - 我會添加另一個output.collect語句嗎?我知道我必須閱讀該行並將其分成屬性。 3.它說實現映射器 - 我做了所有4 IntWritable是否正確?

+0

也許你會是更好地與豬http://pig.apache.org/docs/r0.8.0/piglatin_ref1.html? – wlk 2011-04-18 20:55:16

+1

這個問題已經過時了,如果有人發現這個問題,我無法拒絕留下評論。我認爲正確的實施完全取決於你想要計算哪種「調查統計」。例如。你想知道所有參與者的平均年齡?或者你想知道在3歲(15-17,18-20,21-23,...)範圍內按年齡分組的參加者的平均分數?這些信息對於定義Mapper的正確輸出非常重要。 – 2012-06-27 08:28:46

回答

4

Mapper接口按照以下順序預計4個類型參數:地圖輸入鍵,地圖輸入值,地圖輸出鍵和地圖輸出值。在你的情況下,因爲你正在處理4個整數,其中3個是你的值,1個是你的鍵,你使用IntWritable作爲Map輸入鍵是錯誤的,應該使用Text來代替。此外,您在MapClass定義中指定的類型與傳遞給Map函數的類型不匹配。

public static class MapClass extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, IntWritable> 

從本質上說,我們假定你是每張地圖調用,你會被解析成你想要的字段和文本文件的一個輸入線:鑑於您在處理文本文件,如下您MapClass應該被定義將它們轉換爲map函數中的整數。所以,你的地圖功能將不得不定義如下:

public void map(LongWritable key, Text value, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {...}