解决hive表中文乱码问题
创始人
2024-03-25 19:02:06
0

问题背景

使用的mysql版本:Server version: 5.7.31

现象描述:字段名称和字段描述等存储进如hivemetastore是中文,查询出来也是???等无法识别的中文乱码;

0: jdbc:hive2://hadoop03:10000/> show create table agnt_operation_log_big
. . . . . . . . . . . . . . . .> ;
+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE TABLE `agnt_operation_log_big`(             |
|   `opt_menucount` string COMMENT '????',           |
|   `opt_menu` string COMMENT '??',                  |
|   `opt_time` string COMMENT '???????')             |
| PARTITIONED BY (                                   |
|   `inc_day` string COMMENT '??')                   |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' |
| LOCATION                                           |
|   'hdfs://hadoop02:8020/data/hive/warehouse/db1_fang.db/agnt_operation_log_big' |
| TBLPROPERTIES (                                    |
|   'transient_lastDdlTime'='1658129989')            |
+----------------------------------------------------+

中文乱码的情况分为两种情况:

  • 新建hive集群防止中文乱码

  • 已有的hive集群中文乱码的纠正

一、新建hive集群防止中文乱码

在构建hive开发环境的时候,需要实现构建号对应的hivemetastore依赖的mysql数据库和表

  1. 创建mysql支持中文的数据库

-- 设置utf8的中文编码
CREATE DATABASE `hive_metastore_ljgk` /*!40100 DEFAULT CHARACTER SET utf8 */
-- 或者
CREATE DATABASE `hive_metastore_ljgk` DEFAULT CHARACTER SET utf8 COLLATE utf_general_ci;

  1. 如下是整个hivemetastore以来的mysql的所有表的sql脚本,里面已经改变支持中文,例如支持中文表描述,字段描述等(hive_metastore_ljgk.sql脚本);例如如下,其中已经将编码改变为utf8: 

----------------------------
-- Table structure for CDS
-- ----------------------------
DROP TABLE IF EXISTS `CDS`;
CREATE TABLE `CDS`  (`CD_ID` bigint(20) NOT NULL,PRIMARY KEY (`CD_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 

   2. 将设置好的hivemetastore以来的mysql的hive_metastore_ljgk.sql脚本,执行并导入到mysql的hive_metastore_ljgk库中:

mysql -h 172.18.8.77 -P 3306 -u root -p xxxxxxxxxxxxx -D hive_metastore_ljgk < /home/fangct/hive_metastore_ljgk.sql

  1. 全部设置全了之后 ,重启hivemetastore服务和hiveserve2服务(hiveserve2应该不用重启);

  2. 验证是否支持中文生效

在hive sql命令行中(此处是beeline),执行hivesql

示例:

create table agnt_operation_log_big
(opt_menucount string comment '统计数据',opt_menu      string comment '菜单',opt_time      string comment '日志搜集表日期'
)PARTITIONED by (inc_day string comment '分区') ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat';

显示所有的hive 创建表字段信心

0: jdbc:hive2://hadoop03:10000/> show create table agnt_operation_log_big;
+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE TABLE `agnt_operation_log_big`(             |
|   `opt_menucount` string COMMENT '统计数据',           |
|   `opt_menu` string COMMENT '菜单',                  |
|   `opt_time` string COMMENT '日志搜集表日期')             |
| PARTITIONED BY (                                   |
|   `inc_day` string COMMENT '分区')                   |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' |
| LOCATION                                           |
|   'hdfs://hadoop02:8020/data/hive/warehouse/db_fang.db/agnt_operation_log_big' |
| TBLPROPERTIES (                                    |
|   'transient_lastDdlTime'='1658130710')            |
+----------------------------------------------------+

如上所示,hive表中字段的comment已经支持中文正常显示;

注意事项:hive不支持中文表名称,仅仅支持中文字段描述,中文表的描述信息;如下所示

create table if not exists dwd_user (
cookie string COMMENT 'cookie',
country string COMMENT '国家',
province string COMMENT '省',
city string  COMMENT '城市'
) COMMENT '埋点中用户信息筛选'
partitioned by (everyday string)
row format delimited 
fields terminated by '\001'
lines terminated by '\n'
stored as orc;

二、已有的hive集群中文乱码的纠正

网上已有现成案例(未验证):

hive中文乱码解决方法

hive中解决中文乱码

hive 表支持中文设置

注意mysql中字符定义规则:

mysql中共有4种级别的字符集编码的设置:Mysql Server级别、 数据库级别、表级别、列级别

如果要支持中文,最好是构建集群的时候,就将mysql服务器级别设置成支持中文格式的服务器级别的;例如utf8

相关内容

热门资讯

猪八戒吃西瓜怎么改为夸张句 猪八戒吃西瓜怎么改为夸张句猪八戒张开了宇宙一般的血盆大口吞下了地球般大的西瓜
一个木一个羽念什么 一个木一个羽念什么    栩,读作xǔ。  栩 xǔ  〈名〉  形声。从木,羽声。亦称“杼”。本义...
赛尔号雷神天明闪怎么打 赛尔号雷神天明闪怎么打赛尔号中雷伊雷神天明闪建议使用特训后的雷伊打,现在打起来比较简单,带过地面石、...
古文言中有哪个字韵脚是“an”... 古文言中有哪个字韵脚是“an”而且有“用”的意思Ban:办,半,般,班,拌,搬,板,伴,瓣Can:蚕...
与长江三峡水电站相关的重要地理... 与长江三峡水电站相关的重要地理分界线是什么?第二阶梯与第一阶梯分界线因为这个地区海拔高度落差大,水的...
传奇的魔法神石怎么样获得? 传奇的魔法神石怎么样获得?魔法神石是在幽明领地的BOSS爆的说不定的``GM喜欢他在那里爆就在那里爆...
华谊公司旗下艺人有哪些优秀艺人... 华谊公司旗下艺人有哪些优秀艺人?华谊兄弟旗下的艺人多达四十多人,但有名的不是很多华谊旗下有很多很不错...
丁磊说大多数的中国学生不具备独... 丁磊说大多数的中国学生不具备独立思考能力,他为何这么说?是因为现在有很多的学生都非常依赖自己的父母,...
为何18岁男子脑死亡火化前妈妈... 为何18岁男子脑死亡火化前妈妈大喊别离开下一秒突然复活?我觉得应该是哪里出现了纰漏,这名男子并没有死...
关于宇宙的科普电影 关于宇宙的科普电影银河系漫游指南 绝对是是吧,《旅行到宇宙边缘》旅行到宇宙边缘
北京工商大学会计专业考研科目都... 北京工商大学会计专业考研科目都有什么?专业复习用书都用什么?初始考802管理学指定参考书是周三多《管...
作者为什么要写丁香结? 作者为什么要写丁香结?“丁香结”的本义是小小的花苞圆圆的,鼓鼓的,恰如衣襟上的盘花扣。象征意义是人生...
原核生物和真核生物的区别 原核生物和真核生物的区别真核有复杂的内膜系统(细胞器),原核生物无真核有细胞核,原核无成型的细胞核基...
怎样不吃药摆脱抑郁症 怎样不吃药摆脱抑郁症以前靠心理治疗,但是后面有一段时期加重了。但是药的副作用太大,可以不吃药吗?想开...
诺曼底登陆的作用和对二战的意义 诺曼底登陆的作用和对二战的意义改变了二战的战局,加快盟军胜利的到来。
怎么样才能学习学得“细”呢? 怎么样才能学习学得“细”呢?细是注意细节地方,平时做题多思考,尽量全面一些,不要学习时觉的理解了就完...
去年几滴相思水,化做树下种花泪... 去年几滴相思水,化做树下种花泪,谁家少年踏春来,折下枝头红玫瑰!这首诗的意思是什么?暗示爱意。指思念...
小花仙找主人! 小花仙找主人!我只要你帮我照顾花朵,每月一个礼物可以吗?我有额外条件:一个星期星期一,三,五一定要上...
手机在信号不好的时候 对方打不... 手机在信号不好的时候 对方打不进来 能设置来电转移吗rt 是否需要开通什么业务 怎么办理不需要去移...
与看透生死或看透人生有关的歌曲... 与看透生死或看透人生有关的歌曲 比如悟我觉得三国演义主题曲有一种世态苍爽的感觉 ,得意的笑 潇洒走...