Hive查询表字段问题记录

最近在做Hive数据导出的功能。

在操作过程中,出现了表字段信息不符字段描述信息不符的情况。

解决之后记录一下。

1 业务场景

我们要做的是将Hive中的数据导出到文件或者DB中,需要可根据指定字段和规则等导出。

那么这样第一步就是需要获取Hive目标表的字段信息供用户选择。

2 事故现场

查询表字段使用的是下面语法,结果如图所示

1
Describe db.table;

可以看到,不光字段集合有问题,而且字段的注释也是中文乱码的。

3 解决方案

3.1 字段列表不符问题

图中红色框内的信息其实不是hive的表字段信息,因为没有找到其他的方式去做这个功能,所以目前依旧是使用Describe语法,然后进行过滤

先过滤掉字段名不合适的那几个,再按字段名去重,就可以实现需求了,如果其他人有更好的办法,可以推荐以下。

3.2 字段描述中文乱码问题

这个原因是Hive的元数据库编码Hive使用JDBC连接的配置编码问题。

3.2.1 修改元数据库的编码

我们hive的元数据库使用的是Mysql,所以执行以下语句

1
2
3
4
5
6
7
8
9
# 修改字段注释字符集
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;

3.2.2 修改Hive连接JDBC的配置编码

修改hive的配置文件``hive-site.xmlCDH的话配置文件是在/etc/hive/conf.cloudera.hive目录下。

添加或修改以下配置

1
2
3
4
5
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://host:port/dbname?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>

4 结果校验

我们新建一个Hive表,然后查询一下字段信息测试一下

1
2
3
4
5
6
7
8
9
CREATE  TABLE test1
(
app_code string COMMENT 'appcode注释',
username string COMMENT 'username注释'
)
PARTITIONED BY (DT string)
STORED AS PARQUET;

Describe test1;

可以看到,字段注释的乱码问题已经解决

5 躺板板

红伞伞白杆杆,吃完一起躺板板

躺板板埋山山,亲朋都来吃饭饭

饭饭里有红伞伞,吃完全村埋山山,来年长满红伞伞

联系博主,加入【羊山丨交流社区】

联系博主


本博客所有文章除特别声明外,均为原创。版权归博主小马所有。任何团体、机构、媒体、网站、公众号及个人不得转载。如需转载,请联系博主(关于页面)。如其他团体、机构、媒体、网站、博客或个人未经博主允许擅自转载使用,请自负版权等法律责任!