笔者工作中有时候会用到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 extendedtblname partition (day='2018-01-01');
#查看表的相关列信息
show columns in tblename;
desc tblename;
#查看其他相关信息
show tblproperties tblename;
来源:oschina
链接:https://my.oschina.net/u/4269711/blog/3591888