解决Hive视图View数据乱码的问题

1、场景描述

在Hive中,基于某个表创建视图,直接引用表的字段是不会有问题的;但如果增加一个不存在表中的字段,且字段值为中文,就会出现乱码的问题。

create table t_unicode_test as select '中国' as country;

create view v_unicode_test as select country, '中国' as country2 from t_unicode_test;

select * from test.v_unicode_test;

+-------------------------+--------------------------+
| v_unicode_test.country  | v_unicode_test.country2  |
+-------------------------+--------------------------+
| 中国                    | ??                       |
+-------------------------+--------------------------+

2、解决过程

        在网上找了一圈,原因是Hive的元数据库默认编码是 Latin1(ISO-8859-1),解决方案基本都是去Hive元数据库修改编码。

        等等,Excuse me???谁家的开发权限这么大,还可以改元数据库?没有权限访问Hive的元数据库,看来只能 “曲线救国” 了。

        思来想去,最后发现使用 Unicode码 就可以了。

3、解决方案

        问题来了,如何将字符串转换为Unicode码。我在网上抄了一段java代码:

public static String strToUnicode(String str) {
	char[] chars = str.toCharArray();
	StringBuilder returnStr = new StringBuilder();
	for (char aChar : chars) {
		returnStr.append("\\u").append(Integer.toString(aChar, 16));
	}
	return returnStr.toString();
}


public static void main(String[] args) {
	String str = "中国";

	System.out.println(strToUnicode(str));
}

结果:\u4e2d\u56fd

再修改一下创建视图的语句

alter view v_unicode_test as select country, '\u4e2d\u56fd' as country2 from t_unicode_test;

select * from test.v_unicode_test;

+-------------------------+--------------------------+
| v_unicode_test.country  | v_unicode_test.country2  |
+-------------------------+--------------------------+
| 中国                     | 中国                     |
+-------------------------+--------------------------+

完美解决

后话:

        如果本地没有java环境,可以借助一下Hive

select java_method('java.net.URLEncoder', 'encode', '中国', 'UTF-16BE');

+---------------+
|      _c0      |
+---------------+
| %4E%2D%56%FD  |
+---------------+

你可能感兴趣的:(hive,hive,数据仓库,java,sql)