Java MapReduce:如何在没有换行符的情况下输出键/值对?
我正在使用0 reduce方法解决我的问题。我希望预处理一个文件中的数据,然后将其作为另一个文件写入,但没有新行和制表符?我怎样才能输出我的地图作业,该作业已使用与预处理相同的文件格式处理了我的数据。 也就是说,我有这样的东西: 预处理: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
<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);