Hive 表注释显示乱码问题,GC 方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive 表注释显示乱码问题,GC 方式相关的知识,希望对你有一定的参考价值。
参考技术A 1、修改字段注释字符集alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
2、修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
3、修改分区表参数,以支持分区键能够用中文表示。
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;
select count(*) 得0的问题,hive表有记录,涉及count计算有关设置
hive默认设置 hive.compute.query.using.stats=true //改为false 不从元数据取值,可计数,但性能不高,不推荐
set hive.compute.query.using.stats=false
beeline 后台执行
/home/ocdp/.bash_profile 添加如下行
export HADOOP_CLIENT_OPTS="-Djline.terminal=jline.UnsupportedTerminal"
递归删除partion
#!/bin/bash
for i in 201704 201705 201706 201707 201708 201709 201710 201711 201712 201801 201802 201803 201804
do
for j in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
do
echo "alter table bass.kpi_scp_cd005 drop if exists partition(stat_month="\'$i\'",stat_date="\'$i$j\'");"
beeline -u jdbc:hive2://10.31.10.29:10000/bass -n bass -p bass -e "alter table bass.kpi_scp_cd005 drop if exists partition(stat_month="\'$i\'",stat_date="\'$i$j\'");"
done
done
exit 0
更改hive GC CMS 方式
Ambari > Hive > Configs > Advanced hive-env > hive-env template > Add the follow properties.
if [ "$SERVICE" = "hiveserver2" ]; then
if [ -z "$DEBUG" ]; then
export HADOOP_OPTS="-server -XX:ParallelGCThreads=30 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hive/$USER/hs_err_pid%p.log -XX:NewSize=2048m -XX:MaxNewSize=2048m -Xloggc:/var/log/hadoop/$USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms4096m -Xmx193275m"
else
export HADOOP_OPTS="-server -XX:ParallelGCThreads=30 -XX:+UseConcMarkSweepGC -XX:ErrorFile=/var/log/hive/$USER/hs_err_pid%p.log -XX:NewSize=2048m -XX:MaxNewSize=2048m -Xloggc:/var/log/hadoop/$USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms4096m -Xmx193275m"
fi
fi
Make sure that the new settings has been applied successfully, as well as the heap sizes.
/usr/jdk64/jdk1.8.0_112/bin/jcmd <hiveserver_pid> VM.flags
/usr/jdk64/jdk1.8.0_112/bin/jmap -heap <hiveserver_pid>
Hive 字段和表注释乱码
上一篇我是解决了hiveb表中数据为中文乱码的问题,今天又碰到建表时加上中文注释位乱码,自己也是头大了,下面是我转载的一位大神的方法,仅供参考:
转载自:https://my.oschina.net/jackieyeah/blog/742088
创建Hive表
使用以下语句在 Hive 中创建带有注释的表:
CREATE TABLE IF NOT EXISTS links (
movieId INT COMMENT '电影ID',
imdbId INT COMMENT 'imdb电影ID',
tmdbId INT COMMENT 'themoviedb电影ID')
COMMENT '电影链接表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
接下来使用 show create table links 语句查看 links 建表信息:
可以看到表字段和表中文注释出现乱码。
解决方案
修改Hive元数据库编码
当 Hive 使用 MySQL 作为元数据库的时候, MySQL 的字符集要设置成latin1 default。
使用 show create database hive 语句查看 hive 数据库默认编码。
使用 alter database hive default character set latin1 将 hive 数据库默认编码改成 latin1。
修改相关表相关字段编码
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;
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;
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
打Patch
Hive 表注释中文乱码是Hive的一个bug, 详情参见 注释不能支持Unicode字符 。在 2.1.0 版本中还未解决这个bug, 所以需要自己手动打patch。链接中已经提供了patch文件:
方便做个记录,现将 HIVE-11837.1.patch 内容粘贴出来:
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
index 6fca9f7ec86574a6053af3672c551c6a63aa4870..661367f27b69f9796140808eda53a3bbcdcbdb11 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
@@ -2048,7 +2048,7 @@ private int showCreateTable(Hive db, DataOutputStream outStream, String tableNam
if (tbl.isView())
String createTab_stmt = "CREATE VIEW `" + tableName + "` AS " + tbl.getViewExpandedText();
- outStream.writeBytes(createTab_stmt.toString());
+ outStream.write(createTab_stmt.toString().getBytes("UTF-8"));
return 0;
@@ -2196,7 +2196,7 @@ else if (sortCol.getOrder() == BaseSemanticAnalyzer.HIVE_COLUMN_ORDER_DESC)
createTab_stmt.add(TBL_PROPERTIES, tbl_properties);
- outStream.writeBytes(createTab_stmt.render());
+ outStream.write(createTab_stmt.render().getBytes("UTF-8"));
catch (IOException e)
LOG.info("show create table: " + stringifyException(e));
return 1;
前面的 + 号表示需要新加的代码,- 号表示需要删除的代码
接下来下载 Hive 2.1.0 源码包 apache-hive-2.1.0-src.tar.gz,然后解压。修改 DDLTask.java 源码,接着使用以下Maven命令进行编译打包。
mvn clean package -DskipTests=true
最后, 将新生成的 hive-exec-2.1.0.jar 文件替换掉 hive 安装目录 lib 目录下的 hive-exec-2.1.0.jar 文件。
验证
重启 Hive 客户端 ,然后删除原先建的表:drop table links。
再次运行第一步中的建表语句并再次运行 show create table links 查看中文注释是否乱码。
可以看到 hive 表注释和字段注释可以正常显示中文了。
以上是关于Hive 表注释显示乱码问题,GC 方式的主要内容,如果未能解决你的问题,请参考以下文章