java—将hadoop mapreduce输出编写为2个平面文件

dzjeubhm  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(398)

所以我有一个mapreduce工作,它接收多篇新闻文章并输出以下键值对。

.
.
.
<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输出的平面文件中。不管怎样,我是否可以简单地将社交标记输出到文件1,将主题代码输出到文件2,或者将社交标记输出到指定的一组文件(social1.txt、social2.txt…等),将主题代码输出到另一组文件(topic1.txt、topic2.txt…等)
我问这个问题的原因是为了以后我可以很容易地把所有这些存储到Hive表中。我最好为每种不同的数据类型(主题代码、社交标签等)创建一个单独的表,。。。如果你们中有人知道一个简单的方法来实现这一点,而不必将mapreduce输出分离到不同的文件,那也会非常有用。
提前谢谢!

lo8azlld

lo8azlld1#

如前所述,您可以使用multipleoutputs。正如您所要求的,有一种简单的方法可以实现这一点,而不必将mapreduce输出分离到不同的文件。这里有一个快速的方法,如果数据量不是很大的话!!!。区分数据的逻辑也不太复杂。
首先将混合输出文件加载到配置单元表(比如main\ u表)中。然后您可以创建两个不同的表(topic\u code、social\u 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
cqoc49vn

cqoc49vn2#

我认为您可以尝试在hadoopapi中提供多个输出。multipleoutputs允许您将数据写入文件,这些文件的名称是从输出键和值派生的,或者实际上是从任意字符串派生的。这允许每个缩减器(或仅Map作业中的Map器)创建多个文件。对于Map输出,文件名的格式为name-m-nnnnn,对于reduce输出,文件名的格式为name-r-nnnnn,其中name是由程序设置的任意名称,nnnnn是指定零件号的整数,从零开始。
在reducer中,我们生成输出,在setup()方法中构造multipleoutputs的示例,并将其赋给示例变量。然后使用reduce()方法中的multipleoutputsinstance来代替上下文写入输出。write()方法接受键和值以及名称。
您可以查看下面的链接了解详细信息
http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/lib/multipleoutputs.html

相关问题