笔者工作中有时候会用到HIVE META 元数据库,临时查找相关信息比较麻烦,主要常用的表如下,以备后续查阅
表名 | 说明 | 关联键 |
DBS | 所有hive库的基本信息 | DB_ID |
TBLS | 所有hive表的基本信息 | TBL_ID,SD_ID |
TABLE_PARAM | 表的相关属性信息,如是否外部表,表注注释及一些文件的统计信息等 | TBL_ID |
COLUMNS | Hive表字段信息(字段注释,字段名,字段类型,字段序号) | SD_ID |
SDS | 所有hive表、表分区所对应的hdfs数据目录和数据格式 | SD_ID,SERDE_ID |
SERDE_PARAM | 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 | SERDE_ID |
PARTITIONS | Hive表分区信息 | PART_ID,SD_ID,TBL_ID |
PARTITION_KEYS | Hive分区表分区键 | TBL_ID |
PARTITION_KEY_VALS | Hive表分区名(键值) | PART_ID |
TBL_PRIVS | hive 权限相关信息,多数是空的 | TBL_GRANT_ID |
嘿嘿,这次偷下懒,改天画下图
1,有时候需要批量找出某些特征表相关信息的时候,临时组织sql比较麻烦,先记录下之前的sql
对外封装hive meta接口的时候比较有用
#比如找出表名,列名,列类型,注释,及字段序号,去掉where条件可以找出所有表
SELECT c.TBL_NAME tblname, a.COLUMN_NAME columnname, a.TYPE_NAME typename, a.COMMENT comment, CONCAT('com',INTEGER_IDX) columnnum FROM COLUMNS_V2 a join SDS b on a.CD_ID=b.CD_ID join TBLS c on b.SD_ID =c.SD_ID join DBS d on c.DB_ID=d.DB_ID WHERE c.TBL_NAME ='tblname' AND d.NAME='dbname' union all SELECT c.TBL_NAME tblname, a.PKEY_NAME columnname, a.PKEY_TYPE typename, a.PKEY_COMMENT comment, CONCAT('key',INTEGER_IDX) columnnum FROM PARTITION_KEYS a join TBLS c on a.TBL_ID =c.TBL_ID join DBS d on c.DB_ID=d.DB_ID WHERE c.TBL_NAME ='tblname' AND d.NAME='dbname'
2,取出表的相关备注,去掉where获取所有表的备注
SELECT tbls.TBL_NAME tblname, max(case when tbpa.PARAM_KEY='comment' then tbpa.PARAM_VALUE else '' end) comment FROM TABLE_PARAMS tbpa join TBLS tbls ON tbpa.TBL_ID=tbls.TBL_ID join DBS dbs on tbls.DB_ID=dbs.DB_ID WHERE dbs.NAME='dbname' and tbls.TBL_NAME ='tblname' group by tbls.TBL_ID,tbls.TBL_NAME
3,在hive cli中desc hive表字段乱码问题,有可能是在创建库的时候使用默认latin字段,需要改为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; 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;
4,如果元数据库中hive分区表过多,在后续的数据清理,删除,或者插入新分区时,meta 的源数据库(mysql)会出现短暂的暂停,因PARTITIONS,PARTITION_KEY_VALS要加锁,导致后续所有任务在更新分区表结构时都在等待,笔者经历过多个hive表分区建在分钟级(业务面向页面点击事件)两三年以后多大6万多个分区,卡顿超过20分钟,所以这类表要定期清理分区
#找出有3级分区的表名 SELECT CONCAT(d.NAME,'.',c.TBL_NAME) tblname, GROUP_CONCAT(a.PKEY_NAME) , count(a.PKEY_NAME) keyscount FROM PARTITION_KEYS a join TBLS c on a.TBL_ID =c.TBL_ID join DBS d on c.DB_ID=d.DB_ID group by CONCAT(d.NAME,'.',c.TBL_NAME) having count(a.PKEY_NAME)>=3; #找出每个表的分区数(前100名),PARTITION表比较大, SELECT CONCAT(d.NAME,'.',c.TBL_NAME) tblname, count(a.PART_ID) partcounts FROM PARTITIONS a join TBLS c on a.TBL_ID =c.TBL_ID join DBS d on c.DB_ID=d.DB_ID group by CONCAT(d.NAME,'.',c.TBL_NAME) order by partcounts desc limit 100;
5,hive cli 的相关命令
#查看表,分区表格式的相关信息
show partitions tblname partition (day='2018-01-01');
describe formatted tblname partition (day='2018-01-01');
describe formatted tblname;
desc extended
tblname partition (day='2018-01-01');
#查看表的相关列信息
show columns in tblename;
desc tblename;
#查看其他相关信息
show tblproperties tblename;