我必须编写一个 map reduce 批处理(使用org.apache.hadoop.mapreduce.*
API)来处理具有以下属性的文本文件:
- ISO-8859-1编码。
- 类似 CSV
- 分隔符是
0xef
我使用 aTextInputFormat
因为我想自己执行字段拆分。然而,它似乎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)
// [...]
}
}
这个解决方案可以接受吗?