开始的时候使用hive-0.7.1在建表的时候使用如下语句
hive>createtable t1(c1 string comment '列1');
然后查看该表
hive>describet1;
其中的注释变成了乱码。
后来得知是hive版本的问题,然后使用hive-0.8.0(该版本的代码经过了修改,从而支持中文显示)。
(1)将原来hive-0.7.1创建的数据库drop掉。
(2)使用hive-0.8.0,并将原来hive-0.7.1的配置文件copy到0.8.0中使用
(3)执行 hive>create table t1(c1string comment '列1');
会抛出类似于com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was toolong;的异常(省略了很多的java错误信息)。 这时到mysql中的hive数据库里执行 alter database hive character set latin1;改变hive元数据库的字符集,问题就可以解决!
(4)然后在mysql中通过语句:alter tableCOLUMNS_V2 modify column COMMENT varchar(256) character set utf8; 修改COLUMNS_V2表中用于存储注释内容的列的编码格式。(在0.8.0之前存储注释信息的表的名字为COLUMNS,从0.8.0开始改成了COLUMNS_V2)。
(5)重新执行createtable t2(c1 string comment '列1');可以将表创建成功
问题解决,收工~~
在这里补充下为了使hive-0.8.0能够显示所有的元数据中文的全部配置:
让hive的注释可以添加中文
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
表或者字段有中文的时候需要修改hive的元数据库的设置。
以mysql为例子,当mysql的字符集设置成utf8的时候使用hive会有问题
(com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Specified key was too long; max key length is 767 bytes )
所以当hive使用mysql作为元数据库的时候mysql的字符集要设置成latin1 default。
alterdatabase hive character set latin1;
为了保存那些utf8的中文,要将mysql中存储注释的那几个字段的字符集单独修改为utf8。
修改字段注释字符集
alter tableCOLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
修改表注释字符集
alter tableTABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
注意:这里使用的hive不是从官网下载的,而是修改过之后的,我已经传到了csdn上,可以下载使用
hive-0.8.0-sup-chinese.zip
如果使用的hive版本是0.9.0以上,则需要打上HIVE-3914的patch,patch的地址为:https://issues.apache.org/jira/browse/HIVE-3914
(1)hive-0.11.0
我在用hive-0.11.0的时候遇到了中文显示的问题,上面地址的patch打不上去,使用的是https://issues.apache.org/jira/browse/HIVE-2905的patch,里面一共有两个,使用的是https://issues.apache.org/jira/secure/attachment/12589572/HIVE-2905.D11487.1.patch
注意该patch下面是对test的patch,在hive-0.11.0中没有相关的test文件因此需要将https://issues.apache.org/jira/secure/attachment/12589572/HIVE-2905.D11487.1.patch中对test做的patch部分的语句去掉,因此我打上相关的补丁之后,发现在创建表的时候列上的中文注释可以正常显示,但是表上的中文注释还是乱码。
没有办法,只能重新修改源码,解决表上中文注释不能正常显示的问题,修改完之后做成了补丁,提交上了社区上
patch编码为:HIVE-5499,地址为https://issues.apache.org/jira/browse/HIVE-5499
(2)hive-0.12.0
hive-0.12.0的发布,虽然解决了表中的中文列注释显示乱码的问题,但是表注释的中文乱码问题并没有解决,因此,果断修改源码,重新编译,$HIVE_HOME/lib/hive-exec-0.12.0.jar。可以解决表中文注释显示乱码的问题。关于修改的代码也已经递交到了hive的jira上,地址为:
https://issues.apache.org/jira/browse/HIVE-5682
打上该patch可以解决问题。