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 |
+---------------+
本文转载自: https://blog.csdn.net/a38123/article/details/126490579
版权归原作者 HoweSea 所有, 如有侵权,请联系我们删除。
版权归原作者 HoweSea 所有, 如有侵权,请联系我们删除。