2013-11-26 74 views
1

我的映射器(Hadoop 1.2.1)創建了從簡單文本文件讀取的令牌的鍵值對。沒有火箭科學。 Reducer最終會「捆綁」(在Hadoop中,你是否像在SQL中一樣調用該分組?)相同的鍵,並且還將值1相加。這是默認的Hadoop教程。如何從30個最頻繁的單詞中「排序」?

但是,當這些值可用於我的reducer時,我想按降序對它們進行排序。只顯示前30個標記(字符串,單詞)。

看來有些概念對我來說並不清楚。

  • 首先,對每個鍵值對調用reduce方法,對吧?因此,我沒有看到一個地方可以緩存像HashMap這樣的東西,它可以保存頂級結果(最常用的標記)。
  • 我在想,如果我有這樣一個變量,我可以很容易地比較並插入每個有30個值的鍵。處理這個頻率排序任務的適當方法是什麼?

    public static class Reduce extends MapReduceBase implements 
          Reducer<Text, IntWritable, Text, IntWritable> { 
    
    public void reduce(Text key, Iterator<IntWritable> values, 
         OutputCollector<Text, IntWritable> output, Reporter reporter) 
         throws IOException { 
    
        int sum = 0; 
        while (values.hasNext()) { 
         sum += values.next().get(); 
        } 
          // CURRENTLY I SIMPLY OUTPUT THE KEY AND THE SUM. 
          // IN THIS PLACE, HOW COULD YOU STORE E.G. A HASHMAP THAT 
          // COULD STORE THE TOP 30? 
        output.collect(key, new IntWritable(sum)); 
        LOG.info("REDUCE: added to output:: key: " + key.toString()); 
    } 
    

    }

回答

1

首先,減少方法被調用用於每個鍵 - 值對,是嗎? 因此,我沒有看到一個地方緩衝像HashMap的東西,其中 可以保存最高結果(最常見的標記)。

有點微妙之處:reduce方法每個鍵只運行一次,而不是鍵值對。使用該密鑰的每個值都顯示在Iterator中。如果要存儲HashMap,則可以在setup函數中設置該函數(或將其設置爲私有對象),在reduce函數中與其交互,然後在cleanup函數中對其進行任何操作。因此,通過呼叫reduce維持狀態是絕對有可能的。

然而,我認爲你可以用更聰明的方式解決你的問題。我已經多次寫過十大列表,只是因爲我覺得它們很有趣,而且它們是非常有用的工具。我希望很明顯,前30名與前10名的關係如何。

  • Here is an example of a top-ten list generator我寫了一段時間,可以適應您的問題。 您或許可以稍微改變一下自己如何解決您的問題以適應此模式。在我的代碼中,我使用的是TreeMap而不是HashMap,因爲TreeMap保持排序順序。一旦你得到31項,從最低頻率的彈出。

  • 我還在書MapReduce Design patterns(對於無恥插件抱歉)中討論了前十種模式。

  • I blogged about top ten lists幾個月前。

+0

這是一個堅實的開始! TreeMap很有意義!謝謝唐納德。絕對公平的指導書籍和文學(即使它是你的)。 與Hadoop 1.2.1中的'cleanup'方法等價的是什麼?MapReduceBase類從中擴展了mapper和reducer類,不是該方法的宿主。只有'configure'和'close'。 – feder

+1

@feder啊!恥辱!我沒有意識到你正在使用舊的API。注意你的導入語句是'.mapred.'而不是'.mapreduce.' ...我不認爲它有類似的方法。也許你應該考慮轉換。對不起:\ –

+1

我只是買了你的書後:)這確實暗示了一些黑點。 – feder

相關問題