稍微简化一下我的问题,我有一组带有“记录”的文本文件,这些记录由双换行符分隔。喜欢
'multiline text'
'empty line'
'multiline text'
'empty line'
等等。
我需要分别转换每个多行单元,然后对它们执行 mapreduce。
但是,我知道使用 hadoop 代码样板中的默认 wordcount 设置,以下函数中 value
变量的输入只是一行,并且不能保证输入与前一个输入行连续。
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException ;
我需要它是输入 value
实际上是双换行符分隔的多行文本的一个单元。
一些搜索找到了一个 RecordReader
类和一个 getSplits
方法,但没有我可以理解的简单代码示例。
另一种解决方案是将多行文本中的所有换行符替换为空格字符并完成。我宁愿不这样做,因为有相当多的文本,而且它在运行时方面很耗时。如果我这样做,我还必须修改很多代码,所以通过 hadoop 处理它对我来说是最有吸引力的。
最佳答案
如果您的文件很小,则它们不会被拆分。本质上,每个文件都是分配给一个映射器实例的一个拆分。在这种情况下,我同意 Thomas 的观点。您可以通过连接字符串在映射器类中构建逻辑记录。您可以通过查找作为映射器值传入的空字符串来检测记录边界。
但是,如果文件很大并且被拆分,那么除了实现您自己的文本输入格式类之外,我看不到任何其他选择。您可以克隆现有的 Hadoop LineRecordReader 和 LineReader java 类。您必须在您的 LineReader 类版本中做一些小的更改,以便记录分隔符将是两个新行,而不是一个。完成此操作后,您的映射器将接收多行作为输入值。
关于java - 使用 Hadoop 将文本文件中的段落作为单个记录处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5827997/