【问题标题】:Processing paraphragraphs in text files as single records with Hadoop使用 Hadoop 将文本文件中的段落作为单个记录处理
【发布时间】:2011-06-16 10:16:40
【问题描述】:

稍微简化一下我的问题,我有一组带有“记录”的文本文件,这些“记录”由双换行符分隔。喜欢

'多行文字'

'空行'

'多行文字'

'空行'

等等。

我需要分别转换每个多行单元,然后对它们执行 mapreduce。

但是,我知道使用 hadoop 代码样板中的默认字数设置,以下函数中 value 变量的输入只是一行,并且不能保证输入与前一个连续输入行。

public void map(LongWritable key, Text value, 
                OutputCollector<Text, IntWritable> output, 
                Reporter reporter) throws IOException ;

我需要输入 value 实际上是双换行符分隔的多行文本的一个单元。

一些搜索发现了一个RecordReader 类和一个getSplits 方法,但没有简单的代码示例让我一头雾水。

另一种解决方案是将多行文本中的所有换行符替换为空格字符并完成。我宁愿不这样做,因为有相当多的文本并且在运行时方面很耗时。如果我这样做,我还必须修改很多代码,所以通过 hadoop 处理它对我来说最有吸引力。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    如果您的文件很小,则它们不会被拆分。本质上,每个文件都是分配给一个映射器实例的一个拆分。在这种情况下,我同意托马斯的观点。您可以通过连接字符串在映射器类中构建逻辑记录。您可以通过查找作为映射器值传入的空字符串来检测记录边界。

    但是,如果文件很大并且被拆分,那么除了实现您自己的文本输入格式类之外,我看不到任何其他选择。您可以克隆现有的 Hadoop LineRecordReader 和 LineReader java 类。您必须在 LineReader 类的版本中做一个小的更改,以便记录分隔符将是两个新行,而不是一个。完成此操作后,您的映射器将接收多行作为输入值。

    【讨论】:

    • 当我需要处理超过 64MB 的文件或 hadoop 开始拆分文件时,您的回复实际上更有帮助。
    【解决方案2】:

    它有什么问题?只需将前面的行放入 StringBuilder 并在达到新记录时刷新它。
    当您使用文本文件时,它们不会被拆分。对于这些情况,它使用 FileInputFormat,它只与可用文件的数量并行。

    【讨论】:

    • 谢谢!我花了一段时间来实际实施和测试,但你是对的。
    猜你喜欢
    • 2012-09-02
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多