大数据全系列 教程
1869个小节阅读:466.7k
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
命令语法:
xxxxxxxxxx
describe [extended|formatted] [db_name.]table_name
简写为:
xxxxxxxxxx
desc [extended|formatted] [db_name.]table_name
实操演示:
xxxxxxxxxx
hive> desc formatted person;
OK
# col_name data_type comment
id int ????id
name string ??
likes array<string> ??
address map<string,string> ??
去mysql中查看元数据也乱码:
乱码解决方案
检查hive_remote数据库创建,使用的utf8:
xxxxxxxxxx
mysql> show create database hive_remote;
+-------------+----------------------------------------------------------------------+
| Database | Create Database |
+-------------+----------------------------------------------------------------------+
| hive_remote | CREATE DATABASE `hive_remote` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-------------+----------------------------------------------------------------------+
1 row in set (0.00 sec)
检查表COLUMNS_V2的创建语句,发现表和COMMENT使用的latin1编码格式,所以出现中文乱码:
xxxxxxxxxx
mysql> show create table COLUMNS_V2;
| Table | Create Table
| COLUMNS_V2 | CREATE TABLE `COLUMNS_V2` (
`CD_ID` bigint(20) NOT NULL,
`COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
`COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`TYPE_NAME` mediumtext,
`INTEGER_IDX` int(11) NOT NULL,
PRIMARY KEY (`CD_ID`,`COLUMN_NAME`),
KEY `COLUMNS_V2_N49` (`CD_ID`),
CONSTRAINT `COLUMNS_V2_FK1` FOREIGN KEY (`CD_ID`) REFERENCES `CDS` (`CD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
导致字符集编码使用latin1的罪魁祸首在哪里:
文件是/opt/hive-3.1.2/scripts/metastore/upgrade/mysql/hive-schema-3.1.0.mysql.sql文件中。
xxxxxxxxxx
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE IF NOT EXISTS `COLUMNS_V2` (
`CD_ID` bigint(20) NOT NULL,
`COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
`COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`TYPE_NAME` MEDIUMTEXT DEFAULT NULL,
`INTEGER_IDX` int(11) NOT NULL,
PRIMARY KEY (`CD_ID`,`COLUMN_NAME`),
KEY `COLUMNS_V2_N49` (`CD_ID`),
CONSTRAINT `COLUMNS_V2_FK1` FOREIGN KEY (`CD_ID`) REFERENCES `CDS` (`CD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
如何解决?
修改表字段注解和表注解(在mysql上执行)
xxxxxxxxxx
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
修改分区字段注解
xxxxxxxxxx
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
修改索引注解
xxxxxxxxxx
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
删除表hive中person,然后创建person表,再查看表的信息,乱码问题就解决了。
xxxxxxxxxx
hive> desc formatted person;
OK
# col_name data_type comment
id int 唯一标识id
name string 名称
likes array<string> 爱好
address map<string,string> 地址
# Detailed Table Information
Database: default #数据库实例
OwnerType: USER #归属 root 用户
Owner: root
CreateTime: Thu Nov 11 13:16:11 CST 2021 # 创建时间
LastAccessTime: UNKNOWN
Retention: 0
Location: hdfs://mycluster/user/hive_remote/warehouse/person #hdfs路径
Table Type: MANAGED_TABLE # 表类型: 管理表 通常称为内部
Table Parameters:
COLUMN_STATS_ACCURATE {\"BASIC_STATS\":\"true\",\"COLUMN_STATS\":{\"address\":\"true\",\"id\":\"true\",\"likes\":\"true\",\"name\":\"true\"}}
bucketing_version 2
numFiles 0 #有几个文件
numRows 0 #有多少行
rawDataSize 0
totalSize 0 #多大
transient_lastDdlTime 1636607771
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No # 未使用压缩
Num Buckets: -1 # 分桶数量
Bucket Columns: [] # 分桶的列
Sort Columns: [] # 排序列
Storage Desc Params:
collection.delim - # 数组元素与元素之间,map的kv对与kv对之间的分隔符
field.delim , # 列与列之间分隔符
line.delim \n# 记录与记录之间的分隔符
mapkey.delim : #map的key和value之间的分隔符。
serialization.format ,
Time taken: 0.268 seconds, Fetched: 38 row(s)