Hadoop字符转码的实现

    在hadoop中最常见的就是Text,而Text对象是继承了BinaryComparable且实现了WritableComparable接口。在Text内部封装了原始二进制数据byte数组和长度,并且提供了编码解码的工具类,Text的toString()方法是已经解码过的。

    今天在工作中遇到一个问题,我的一个job输出格式为TextInputFormat,但是在另一个job读取的时候总是读取的数据不对,new String(text.getBytes()),使用的是这个方法,后来看hadoop源码发现getBytes()返回的是未经解码的二进制流。

    Hadoop默认使用的是UTF-8编码方式。在Hadoop使用过程中,需要将其他的编码方式进行转码以防止乱码的出现。在Hadoop中出现乱码的情景是TextFileInputFormat,即处理Text的情景。在这种情况下,Value一般是Text。为了实现转码我们看一下Text的实现。在Text中包含了源数据的byte数组以及其中数据的长度,这是原始数据,不经过编码的。在Text类中包含了CharsetEncoder和CharsetDecoder两个变量,这两个变量都是UTF-8编码。当把byte数据写到文件时(writeString方法)需要对其进行Encode,将其编码成UTF-8格式。当Text读入数据时(readString方法),用Decoder将其从UTF-8模式转码成Unicode。
在Map执行过程中,Text的byte数组是原始数据的byte数组,可以直接将该数组进行转码,具体实现如下:

protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
    byte[] valueBytes = value.getBytes();
    String result = new String(valueBytes, "GB2312");
    context.write(key, new Text(result));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值