2013-06-19 78 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