2013-06-19 77 views
1

因此,我有一個MapReduce作業,它接收多篇新聞文章並輸出以下鍵值對。將Hadoop MapReduce輸出寫入2個平面文件

. 
. 
. 
<article_id, social_tag.name, social_tag.isCompany, social_tag.code> 
<article_id2, social_tag2.name, social_tag2.isCompany, social_tag.code> 
<article_id, topic_code.name, topic_code.isCompany, topic_code.rcsCode> 
<article_id3, social_tag3.name, social_tag3.isCompany, social_tag.code> 
<article_id2, topic_code2.name, topic_code2.isCompany, topic_code2.rcsCode> 
. 
. 
. 

正如你所看到的,主要有兩種不同類型的我目前的輸出而現在,這些獲得通過的MapReduce輸出的平面文件混在一起的數據行。無論如何,我可以簡單地輸出social_tags到file1和topic_codes到file2或者可以輸出social_tags到指定的一組文件(social1.txt,social2.txt ..etc)和topic_codes到另一個組(topic1.txt,topic2.txt。 ..etc)

我問這個問題的原因是我可以很容易地將所有這些存儲到Hive表中。我最好希望爲每種不同的數據類型(topic_code,social_tag,...等)提供一個單獨的表格。如果你們中的任何一個人都知道一個簡單的方法來實現這一點,而不需要將mapreduce輸出分離到不同的文件,那將是真正的也有幫助。

在此先感謝!

+0

http://stackoverflow.com/questions/10436811/splitting-reducer-output-in-hadoop – DevZer0

+2

您可以使用自定義'Partitioner' – twid

回答

2

您可以使用MultipleOutputs作爲已經建議。 正如你所要求的一個簡單的方法來實現這一點,而不分離mapreduce輸出到不同的文件。這是一個快速的方法,如果數據量不是真的巨大的話。區分數據的邏輯並不太複雜。

首先將混合輸出文件加載到配置單元表(如main_table)中。然後,您可以創建兩個不同的表(topic_code,social_tag),並在用where子句過濾後從主表中插入數據。

hive > insert into table topic_code 
     > select * from main_table 
     > where $condition; 

    // $condition = the logic you would use to differentiate the records in the MR job 
1

我想你可以嘗試存在於hadoop API中的MultipleOutputs。 MultipleOutputs允許您將數據寫入文件,其名稱來源於 輸出鍵和值,或者實際上來自任意字符串。這允許每個縮減器(或映射器中的 )創建多個單個文件。文件名的格式爲 name-m-nnnnn用於映射輸出,name-r-nnnnn用於reduce輸出,其中name是 任意名稱,由程序設置,nnnnn是指定部分的整數 number,從零開始。

在reducer中,在我們生成輸出的地方,我們在setup()方法中構造一個MultipleOutputs實例並將其分配給一個實例變量。然後,我們使用reduce()方法中的MultipleOutputsinstance來寫入輸出,而不是使用 上下文。 write()方法使用鍵和值以及名稱。

你可以看看下面的鏈接瞭解詳細信息

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/lib/MultipleOutputs.html