2

我正在使用 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 的新手。

我在下面包含了我的地图功能。我不想使用 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,看看我是否能找到答案。

4

2 回答 2

1

在您的映射器类上,不要将您的行解析为单个单词并将它们写出来,而是尝试将整行发送到

context.write(word, null);

这样,它将您最初使用的整个字符串保持在一起,而不是逐个发送行。

因此,将您的字符串分开以进行预处理工作,然后在使用 context.write 命令将其发送出去时将其重新组合在一起。

于 2013-09-28T20:42:33.203 回答
0

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

于 2013-09-28T19:14:24.940 回答