Hive默认的字符编码是UTF8,所以我们LOAD到Hive中的文件都是UTF8编码的,这样对中文也有很好的兼容性。
但是在使用JDBC连接Hive查询数据时,中文会出现乱码。
即使进行转码(无论UTF8还是GB2312)也解决不了,如下:
System.out.println(newString(rs.getString("name").getBytes(), "UTF8"));
System.out.println(new String(rs.getString("name").getBytes(), "GB2312"));
经过进一步调查,发现是在JDBC驱动里取数据时,已经对原始的二进制改变了,后面不管怎么转码都没有用了。所以,我们需要小修改一下Hive JDBC的源码。
需要修改的类是:org.apache.hadoop.hive.jdbc.HiveQueryResultSet
原来的代码是:
StructObjectInspector soi =(StructObjectInspector) serde.getObjectInspector();
List<? extends StructField> fieldRefs =soi.getAllStructFieldRefs();
Object data = serde.deserialize(new BytesWritable(rowStr.getBytes()));
修改后:
StructObjectInspector soi =(StructObjectInspector) serde.getObjectInspector();
List<? extends StructField> fieldRefs =soi.getAllStructFieldRefs();
Object data = serde.deserialize(new BytesWritable(rowStr.getBytes("UTF-8")));
在取二进制时就进行UTF8转码。
重新编译后的HiveQueryResultSet.class更新到原来的jar包中即可,完美解决。