Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapReduce:如何在没有换行符的情况下输出键/值对?_Java_Hadoop_Map_Mapreduce_Reduce - Fatal编程技术网

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

Java MapReduce:如何在没有换行符的情况下输出键/值对?,java,hadoop,map,mapreduce,reduce,Java,Hadoop,Map,Mapreduce,Reduce,我正在使用0 reduce方法解决我的问题。我希望预处理一个文件中的数据,然后将其作为另一个文件写入,但没有新行和制表符?我怎样才能输出我的地图作业,该作业已使用与预处理相同的文件格式处理了我的数据。 也就是说,我有这样的东西: 预处理: <TITLE> Herp derp </Title> I am a major general 我想让它做的是: Herp Derp I am a major general 我认为问题在于这一行代码: job.setOutp

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

预处理:

<TITLE> Herp derp </Title> I am a major general  
我想让它做的是:

Herp Derp I am a major general 
我认为问题在于这一行代码:

job.setOutputFormatClass(TextOutputFormat.class);
然而,当我尝试时,我很天真地做了如下事情:

job.setOutputFormatClass(null);
这显然行不通。是否有提供的format类可用于执行此操作?如果没有,我怎么能编写自己的类,只输出我想要的一切?我是hadoop和MapReduce的新手

我在下面包含了我的地图功能。我不想使用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);
            }
        }

此外,我还用谷歌搜索了一下,并阅读了ApacheHadoopAPI,看看是否能找到答案

如果您的映射程序正在从单个输入行写入包含单个标记的多个记录,那么您绝对需要一个减速机将这些标记重新组合到一行中进行输出。如果没有减缩器,就无法完成此操作。

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

context.write(word, null);
这样一来,它就可以将您最初使用的整个字符串保持在一起,而不是一段一段地发送行


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

我的案例非常狭窄。我的映射程序没有写入多条记录。相反,它是一个原始文件,并对其进行处理,然后像我希望的那样返回预处理后的值,但现在在每一行上。每次调用映射器时,您会调用context.write()多少次。听起来不止一个。如果你想从这些多次写入中得到一行输出,那么你需要一个减速机。我将编辑我的代码以显示我的map函数。但我可以对减速机说不。我将销毁我的文件格式。把它想象成一本书,一首歌,或者其他什么。如果我使用一个减缩器,这将得到排序,并破坏我解析它的任何值。我基本上是使用Mapreduce来解析一些xml标记。我还做了一些词干和停止词。然而,我想让其余的人单独呆着。这很有效。我将每个单词作为键/值对输出。但这个文件中的每个“文档”都是一行。所以一旦我这么做了,一切就都明朗了。谢谢。@GeekyOmega:您想根据输入对输出进行排序吗?
context.write(word, null);