我必须编写一个map reduce batch(使用org.apache.hadoop.mapreduce.*
API)来处理具有以下属性的文本文件:
0xef
我使用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)
// [...]
}
}
这个解决方案可以接受吗?
答案 0 :(得分:1)
我对TextInputFormat没有任何特殊经验,但如果您说的是真的(底层代码只查找\n
的单字节值),那么使用您的字节将这些字节转换为字符串示例代码完全合法。
更新:
您对依赖实施细节的担忧是有效的,但是,这里有一些对您有利的观点:
Text
类使用utf-8编码显式工作。很难在不破坏整个世界的情况下改变它。