问题:
最近建hive表引用了mysql的建表语句:
SELECT 'CREATE TABLE IF NOT EXISTS','要建的hive表名','(','',''
UNION ALL
SELECT CONCAT('`',column_name,'`') colname,
CASE WHEN NUMERIC_PRECISION IS NOT NULL AND (data_type='decimal' OR data_type='numeric' OR data_type = 'money') THEN
'decimal(16,2) ,'
WHEN data_type = 'datetime' THEN
'timestamp'
WHEN data_type = 'tinyint' THEN
'int'
ELSE
'string'
END AS data_type,
' comment ',
CASE
WHEN COLUMN_COMMENT IS NULL THEN
CONCAT('\'',COLUMN_NAME,'\'')
ELSE
CONCAT('\'',REPLACE(COLUMN_COMMENT,';',','),'\'')
END AS COLUMN_COMMENT,
' ,' AS splitCharacter
FROM information_schema.columns
WHERE table_name = 'mysql表名' AND table_schema='mysql库名'
UNION ALL
SELECT ')','comment',CONCAT('\'',TABLE_COMMENT,'\''),'stored as orc','' FROM information_schema.tables WHERE table_name = 'mysql表名' AND table_schema='mysql库名'
在mysql中查询后点击右边显示成下面的样子 贴过去hive建表即可。ps去掉最后那个,逗号。。。。不然语法错误。
然后再hive建表后,发现这些注释都是???,无法识别了。
解决:
修改metastore的存储编码格式。
那么hive的metastore存在哪儿呢,可以去hive-site.xml查找,但是我找到的每台机器都是
hive.metastore.uris
thrift://hadoop-test-10-10-6-102:9083,thrift://hadoop-test-10-10-6-105:9083
不见实际的hive metastore服务器位置,其实直接去cm上看就能看到:
在登录这台机的mysql,进入metastore存储的库,如上图,我的是hive库,所以use hive;
查看存放Hive元数据信息的数据库表字符集:show create table COLUMNS_V2\G;然后会看到表使用的是默认的latin1字符集,所以中文显示不出来,应该使用utf8;
所以,修改以下两张表即可;
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;
再回到Hive查看表结构时就正常显示中文了;
如果hive表创建了分区的话就要再加一条语句:
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;