metastore元数据库表整理

笔者工作中有时候会用到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;

猜你喜欢

转载自www.cnblogs.com/tommyjiang/p/10629731.html