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

时间:2013-09-28 19:04:38

标签: java hadoop map mapreduce reduce

我正在使用0 reduce方法解决我的问题。我希望从一个文件预处理数据,然后将其作为另一个文件写出来,但没有新的行和制表符分隔符?如何输出处理我的数据的地图作业,使用相同的文件格式减去预处理。 也就是说,我有这样的事情:

预处理:

<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和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);
            }
        }

另外,我也搜索了这个并阅读apache hadoop api,看看我是否可以回答一下。

2 个答案:

答案 0 :(得分:1)

在mapper类中,尝试将整行发送到

,而不是将您的行解析为单个单词并将其写出来。
context.write(word, null);

这样就可以保持你原来一起工作的整个字符串,而不是一条一条地发出这条线。

因此,在预处理工作中将字符串分开,然后在使用context.write命令发送它时将其重新组合在一起。

答案 1 :(得分:0)

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