解决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

相关内容

热门资讯

人的一生就是为了,传宗接代吗? 人的一生就是为了,传宗接代吗?那当然不是,每个人都有自己的价值观,如果你有这个想法,证明你被他们影响...
洛克王国诙谐神殿怎么打啊,我有... 洛克王国诙谐神殿怎么打啊,我有70的罗隐和51的少林咕咕,和45的音速,还有一只44的火神,这样能过...
手机屏幕上怎么弄出字 手机屏幕上怎么弄出字手机屏幕上怎么弄出字手机屏幕上怎么弄出字:长按手机桌面,然后点击窗口小工具或小组...
跪求花开伊吕波的结局是怎么样的... 跪求花开伊吕波的结局是怎么样的!真的是得了白血病吗?是的话!KIR了编剧楼主哪里得到的消息? 花开...
苏格兰民歌 一路平安 苏格兰民歌 一路平安还没听过,不好意思,帮不了你
谁能帮我起一个好听的英文名(要... 谁能帮我起一个好听的英文名(要中文)男女?女 我比较喜欢--joy(乔伊)、Renee(瑞妮)、Ma...
寻高手对下联~ 寻高手对下联~琵琶琴瑟八大王 王王在上魑魅魍魉四小鬼,鬼鬼靠边!魑魅魍魉四小鬼,鬼鬼靠边魑魅魍魉四...
《一位母亲与家长会》的3道阅读... 《一位母亲与家长会》的3道阅读题1.我没有原文。对不起。2.因为母亲在鼓励她的孩子,她要使自己的孩子...
深深的喜欢等于爱吗? 深深的喜欢等于爱吗?喜欢不等于爱。但当你站在你喜欢的人面前,你只感到开心但当你与你喜欢的人四目交投,...
《人性的弱点》一书作者是谁? 《人性的弱点》一书作者是谁?《人性的弱点》·作者:(美)戴尔·卡耐基文名:DaleCarnegie戴...
浪漫一生的英文怎么写 浪漫一生的英文怎么写a so long liferomance all one's lifeRoma...
古代什么词可以指代美女? 古代什么词可以指代美女?谢谢!一楼的你说的不对吧?我说的是指代,不是形容啊。形容我也会,倾国倾城,冰...
以前有看过部分小说是《神雕侠侣... 以前有看过部分小说是《神雕侠侣》后面的,不知是那部小说? 想问问?不是,是别人续写的一部小说?只是记...
在工作中学习到什么?” 在工作中学习到什么?”工作中可以学到与本职工作相关的技术、技巧。了解工作的流程。以及本工作的重点及注...
《西游记》中女妖怪有不少,其中... 《西游记》中女妖怪有不少,其中最可怜的女妖怪是谁?中女妖怪有不少,其中最可怜的女妖怪是白骨夫人最可怜...
英文名字‘爱丽儿’的英文到底怎... 英文名字‘爱丽儿’的英文到底怎么写?!Alier Ariel作为英文名字,这两个里哪个更好?先谢谢...
武术在实战中有用吗 武术在实战中有用吗真的打架能不能那么帅?有用,一个会武术的人和一个会武术的人格斗,就要使用一些较为复...
关于模拟人生3夜店人生 关于模拟人生3夜店人生1你的Net Framework版本过低,去安装 一个最新版的4.0的2这个问...
吴启华版倚天屠龙记张无忌哪一集... 吴启华版倚天屠龙记张无忌哪一集上的武当山吴启华版倚天屠龙记张无忌哪一集上的武当山,就是扮成个小道童,...
《三国演义》战长沙的时候,如果... 《三国演义》战长沙的时候,如果关羽的拖刀计用全了,能够斩杀黄忠吗?我认为是可以斩杀黄忠的,因为当时黄...