hive mysql utf8_解决各个hive版本中文注释不能正确显示的问题

本文介绍了如何解决Hive不同版本中出现的中文注释乱码问题,包括使用hive-0.8.0进行创建表操作时遇到的错误,以及通过更改MySQL元数据库字符集和修改Hive相关表的字符集设置来实现中文注释的正常显示。此外,还提到了针对hive-0.11.0和hive-0.12.0的补丁和源码修改方法。

开始的时候使用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的注释可以添加中文

javax.jdo.option.ConnectionURL

jdbc:mysql://IP:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8

JDBC connect string for a JDBC metastore

表或者字段有中文的时候需要修改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的字符集要设置成latin1default。

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

(1)hive-0.11.0

注意该patch下面是对test的patch,在hive-0.11.0中没有相关的test文件因此需要将https://issues.apache.org/jira/secure/p_w_upload/12589572/HIVE-2905.D11487.1.patch中对test做的patch部分的语句去掉,因此我打上相关的补丁之后,发现在创建表的时候列上的中文注释可以正常显示,但是表上的中文注释还是乱码。

没有办法,只能重新修改源码,解决表上中文注释不能正常显示的问题,修改完之后做成了补丁,提交上了社区上

(2)hive-0.12.0

hive-0.12.0的发布,虽然解决了表中的中文列注释显示乱码的问题,但是表注释的中文乱码问题并没有解决,因此,果断修改源码,重新编译,$HIVE_HOME/lib/hive-exec-0.12.0.jar。可以解决表中文注释显示乱码的问题。关于修改的代码也已经递交到了hive的jira上,地址为:

打上该patch可以解决问题。

<think>我们正在解决Hive配置字符集为UTF-8的问题。根据引用,我们知道Hive的元数据存储在MySQL(或其他关系型数据库)中,默认字符集是latin1,这会导致中文注释乱码。因此,我们需要将元数据库的字符集改为UTF-8,并调整Hive的连接配置。 但是,引用[2]提到一个矛盾点:因为MySQL通过my.cnf一般设置为utf-8编码,但Hive在创建元数据库时要求将MySQL中的hive库改回latin1?这实际上是为了避免在早期版本Hive中创建表时出现索引键过长的问题(如引用[4]中的错误:Specified key was too long; max key length is 767 bytes)。然而,我们的目标是要支持UTF-8,所以需要综合考虑。 实际解决方案有两个方向: 1. 将元数据库的字符集改为utf8(或utf8mb4),并调整Hive连接字符串的字符集设置。 2. 为了避免索引键过长的问题,可能需要调整MySQL的innodb_large_prefix参数,或者缩短某些字段的长度(但Hive的元数据表结构是固定的,所以修改表结构有风险)。 然而,根据引用[1]和[3]的建议,我们可以通过修改元数据库中存储注释的字段的字符集为UTF-8,并在Hive的连接URL中指定字符集为UTF-8。 具体步骤: 步骤1:修改Hive元数据库的字符集 首先,我们需要修改MySQLHive元数据库(默认为hive)的字符集为utf8(或utf8mb4),以及相关表的字符集和对应字段的字符集。 步骤2:修改Hive的连接配置 在hive-site.xml中,确保JDBC连接URL中指定了字符集为UTF-8。 但是,引用[4]提示了索引键过长的问题,这是因为在UTF-8字符集中,一个字符可能占用3-4字节,而原来latin1一个字符1字节。因此,当使用UTF-8时,索引字段的总字节数可能超过767字节(InnoDB的默认索引最大长度)。所以,我们需要同时调整MySQL的配置以支持更大的索引长度。 因此,完整的解决方案如下: 一、修改MySQL配置(以MySQL为例): 1. 确保MySQL的全局字符集设置为UTF-8,并启用大索引前缀支持(需要MySQL>=5.7.7,默认innodb_large_prefix=ON,并且innodb_file_format=Barracuda)。如果MySQL版本较低,需要手动设置: 在my.cnf中添加: ``` [mysqld] character-set-server=utf8 collation-server=utf8_general_ci innodb_file_format=Barracuda innodb_large_prefix=ON innodb_file_per_table=ON ``` 2. 修改元数据库的字符集: 登录MySQL,执行: ```sql ALTER DATABASE hive CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 3. 修改Hive元数据表中所有字段的字符集(特别是注释字段): 由于Hive元数据表数量较多,且每个表中可能有多个字符串类型的字段,需要逐一修改。但我们可以通过生成批量SQL来修改。 生成修改表的SQL语句: ```sql SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS sql_statements FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'hive'; ``` 然后执行生成的SQL。 另外,特别注意那些存储注释的字段,比如: - `COLUMNS_V2`表的`COMMENT`字段 - `TABLE_PARAMS`表的`PARAM_VALUE`字段(可能存储表的注释) - `PARTITION_KEYS`表的`PKEY_COMMENT`字段 - 等等 但上面的语句已经将整个表转换为utf8,所以这些字段也会被转换。 二、修改Hive配置: 在hive-site.xml中,修改JDBC连接URL,确保指定了字符集为UTF-8: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://your_mysql_server:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value> </property> ``` 注意:这里必须添加`useUnicode=true`和`characterEncoding=UTF-8`参数。 三、重建索引(可选): 由于字符集改变,索引可能需要重建。我们可以删除索引并重建,或者使用`ALTER TABLE ... ENGINE=InnoDB`重建表。 但是,注意:Hive在启动时会自动检查元数据表的版本并进行升级,因此如果表结构有变化,可能需要运行Hive的元数据升级工具(schematool)。所以,在修改字符集后,建议运行: ```bash schematool -dbType mysql -upgradeSchema ``` 四、避免索引键过长问题: 如果遇到索引键过长的问题(如引用[4]),我们可以考虑以下方法: 1. 如前所述,启用innodb_large_prefix(需要MySQL5.7.7以上,或5.6.3以上并配置正确)。 2. 如果仍然出现错误,可能需要修改元数据表,将索引字段的长度减小。但注意,这可能会影响Hive元数据的存储,因此需要谨慎。实际上,Hive在后续版本中已经修复了这个问题(如HIVE-12274)。所以,升级Hive版本也可能是解决方案之一。 注意:以上操作需要在元数据为空或者停止Hive服务的情况下进行。如果元数据中已经有大量数据,修改字符集时可能需要较长时间。 总结步骤: 1. 备份元数据库(非常重要)。 2. 修改MySQL配置(启用大索引前缀,设置字符集为utf8)。 3. 修改元数据库的字符集为utf8。 4. 修改元数据库中所有表的字符集为utf8。 5. 修改hive-site.xml中的JDBC连接URL,添加字符集参数。 6. 重启MySQL服务(如果需要使配置生效)。 7. 升级Hive元数据(schematool -upgradeSchema)。 8. 启动Hive服务。 注意:不同版本Hive可能存在差异,请根据实际版本调整。 由于操作步骤复杂,且有一定风险,请务必在测试环境中验证后再在生产环境中操作。 相关问题: §§相关问题§§ 1. 如何备份Hive元数据库? 2. 修改字符集后Hive中文注释仍然乱码怎么办? 3. Hive元数据升级失败如何回退? 4. 除了MySQLHive支持哪些其他数据库作为元数据库? 5. 如何查看当前Hive元数据库的字符集设置? </think>### Hive配置元数据库字符集为UTF-8的方法 #### 一、问题核心原因 Hive元数据默认使用Latin1字符集存储,导致中文等UTF-8字符出现乱码。需同时修改三处配置: 1. **MySQL元数据库**的字符集 2. **Hive连接参数**的字符集声明 3. **关键元数据表**的字段编码 #### 二、完整配置步骤 ##### 1. 修改MySQL元数据库字符集 ```sql -- 修改数据库级字符集 ALTER DATABASE metastore CHARACTER SET utf8 COLLATE utf8_general_ci; -- 修改关键表字段类型(需逐表执行) ALTER TABLE COLUMNS_V2 MODIFY COMMENT VARCHAR(256) CHARACTER SET utf8; ALTER TABLE TABLE_PARAMS MODIFY PARAM_VALUE VARCHAR(4000) CHARACTER SET utf8; ALTER TABLE PARTITION_PARAMS MODIFY PARAM_VALUE VARCHAR(4000) CHARACTER SET utf8; ``` > **注意**:需修改所有包含文本的元数据表,常见表包括:`COLUMNS_V2`, `TABLE_PARAMS`, `PARTITION_PARAMS`, `PARTITION_KEYS`, `SDS`等[^1][^2] ##### 2. 修改Hive连接参数 在`hive-site.xml`中添加字符集参数: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://mysql_host:3306/metastore? useSSL=false& useUnicode=true& <!-- 关键参数1 --> characterEncoding=UTF-8 <!-- 关键参数2 --> </value> </property> ``` ##### 3. 解决索引键长度问题 若出现`Specified key was too long`错误,修改MySQL配置(`my.cnf`): ```ini [mysqld] innodb_large_prefix=ON # 启用长索引支持 innodb_file_format=Barracuda # 使用新文件格式 innodb_file_per_table=ON # 必需启用 ``` #### 三、验证配置 1. **检查表注释**(中文应正常显示): ```sql CREATE TABLE test_chinese (id INT COMMENT '中文测试'); DESCRIBE FORMATTED test_chinese; -- 查看表注释 ``` 2. **检查元数据编码**: ```sql -- 在MySQL中执行 SHOW CREATE TABLE COLUMNS_V2; -- 检查字段字符集 ``` #### 四、特殊情况处理 - **已有乱码数据修复**:需备份元数据库后执行`ALTER TABLE ... CONVERT TO CHARACTER SET utf8` - **Hive 3.0+版本**:默认使用DERBY时需额外配置`jdo.option.Mapping` - **多字节字符集**:如需支持emoji等,需改用`utf8mb4`字符集[^4] > ⚠️ **操作警告**:修改元数据库前务必**停止所有Hive服务**并**完整备份metastore数据库** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值