TextInputFormat VS非UTF-8编码

时间:2013-04-08 16:06:30

标签: java hadoop mapreduce

我必须编写一个map reduce batch(使用org.apache.hadoop.mapreduce.* API)来处理具有以下属性的文本文件:

我使用TextInputFormat,因为我想自己执行字段拆分。但是,TextInputFormat似乎只能处理UTF-8编码的文件。

根据MAPREDUCE-232,自2008年以来有一个未决的补丁,但我找不到解决方法。我有什么选择?之前转换UTF-8中的文件不是一种选择。

编辑:在阅读Hadoop源代码时,我想出了一个可能的解决方法。 LineReader&朋友只处理字节。它们从不将字节转换为字符串,它们只匹配硬编码的行结束分隔符并填充字节缓冲区。由于ISO_8859_1和UTF-8共享\n的相同字节序列,因此可以使用:

public class MyMapper extends Mapper<IntWritable, Text, Text, Text> {

    public void map(IntWritable key, Text value, Context context) 
                   throws IOException, InterruptedException {
        String data = new String(value.getBytes(),
                                 0, value.getLength(), 
                                 Charsets.ISO_8859_1)
        // [...]
    }
}

这个解决方案可以接受吗?

1 个答案:

答案 0 :(得分:1)

我对TextInputFormat没有任何特殊经验,但如果您说的是真的(底层代码只查找\n的单字节值),那么使用您的字节将这些字节转换为字符串示例代码完全合法。

更新:

您对依赖实施细节的担忧是有效的,但是,这里有一些对您有利的观点:

  1. “bug修复”自2008年以来仍然开放,并被拒绝,因为它没有正确处理所有编码(也就是说,这是一个需要更多工作才能正确修复的难题)。
  2. Text类使用utf-8编码显式工作。很难在不破坏整个世界的情况下改变它。
  3. 关注第2点,因为你的目标编码有一个与utf-8兼容的换行字节序列,只要你总能找回原始的原始字节,你应该没问题。