3

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

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

根据MA​​PREDUCE-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)
        // [...]
    }
}

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

4

1 回答 1

1

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

更新:

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

  1. “错误修复”自 2008 年以来仍然开放,并被拒绝,因为它没有正确处理所有编码(又名,这是一个需要更多工作才能正确修复的难题)
  2. 该类Text显式使用 utf-8 编码。以后很难在不破坏整个世界的情况下改变这一点。
  3. 在第 2 点之后,由于您的目标编码具有与 utf-8 兼容的换行字节序列,只要您始终可以取回原始原始字节,就应该没问题。
于 2013-04-08T17:37:36.127 回答