mapreduce:如何在没有换行的情况下输出键/值对?

kdfy810k  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(427)

我正在使用0减少方法来解决我的问题。我希望对一个文件中的数据进行预处理,然后将其作为另一个文件写入,但没有新行和制表符?我怎样才能输出我的Map作业,它已经处理了我的数据,它以相同的文件格式来减去预处理。也就是说,我有这样的东西:
预处理:

<TITLE> Herp derp </Title> I am a major general

后处理:

Herp 
Derp 
I 
am 
a
major
general

我要它做的是:

Herp Derp I am a major general

我认为问题在于这一行代码:

job.setOutputFormatClass(TextOutputFormat.class);

然而,当我尝试时,很天真地做了这样的事情:

job.setOutputFormatClass(null);

这显然行不通。是否提供了一个格式类,我可以使用它来执行此操作?如果没有,我怎么能编写自己的类来输出我想要的一切呢?我是hadoop和map reduce的新手。
我已经包括我的Map功能如下。我不想使用reduce,因为它会在map和reducer之间排序。

public void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {

            String line = value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);

            while (tokenizer.hasMoreTokens()) {

                word.set(tokenizer.nextToken());

                //Did preprocessing here, irrelevant to my problem

                context.write(word, null);
            }
        }

另外,我也在google上搜索了这个,并阅读了apachehadoopapi,看看是否能找到答案。

vvppvyoh

vvppvyoh1#

在mapper类中,不要将行解析为单个单词并写出它们,而是尝试将整行发送到

context.write(word, null);

这样一来,它就可以将原来使用的整个字符串保持在一起,而不是一段一段地发送行。
因此,为了预处理工作,请将字符串切分,然后在使用context.write命令发送时将其重新组合起来。

kpbwa7wx

kpbwa7wx2#

如果您的Map器正在从一个输入行写入包含单个标记的多个记录,那么您绝对需要一个reducer将这些标记重新组合到一个行中进行输出。没有减速器你做不到。

相关问题