可以通过查询hive的元数据,得到hive的库/表结构和字段类型,以及表大小和行数。可以做质量监控和快速的需求查询。
本文对查询做一些简单的总结,关于hive的元数据可以查看数仓--Hive--元数据表结构学习,需要清楚元数据表之间的关系和内容
对hive元数据的操作需慎重,最好是能进行隔离处理
- 查询表的某个分区信息
SELECT p.* from PARTITIONS p
JOIN TBLS t
ON t.TBL_ID=p.TBL_ID
WHERE t.TBL_NAME='table'
AND PART_NAME like '%dt=20190420%';
- 查询指定库中stored as textfile类型的所有表名
select
d.NAME,
t.TBL_NAME,
s.INPUT_FORMAT,
s.OUTPUT_FORMAT
from TBLS t
join DBS d
join SDS s
where t.DB_ID = d.DB_ID
and t.SD_ID = s.SD_ID
and d.NAME='test'
and s.INPUT_FORMAT like '%TextInputFormat%';
- 查询指定库中的分区表
多分区表还需要查询出分区的顺序id
select
db.NAME,
tb.TBL_NAME,
pk.PKEY_NAME
from TBLS tb
join DBS db
join PARTITION_KEYS pk
where tb.DB_ID = db.DB_ID
and tb.TBL_ID=pk.TBL_ID
and db.NAME='test';
- 查询指定库中的非分区表
select
db.NAME,
tb.TBL_NAME
from TBLS tb
join DBS db
where tb.DB_ID = db.DB_ID
and db.NAME='test'
and tb.TBL_ID not in (
select distinct TBL_ID from PARTITION_KEYS
) ;
- 查询指定库中,某种存储格式的分区表
select
db.NAME,
tb.TBL_NAME,
pk.PKEY_NAME,
s.INPUT_FORMAT,
s.OUTPUT_FORMAT
from TBLS tb
join DBS db
join PARTITION_KEYS pk
join SDS s
where tb.DB_ID = db.DB_ID
and tb.TBL_ID=pk.TBL_ID
and tb.SD_ID = s.SD_ID
and db.NAME='test'
and s.INPUT_FORMAT like '%TextInputFormat%';
- 查询指定库中某种存储类型的非分区表
select
db.NAME,
tb.TBL_NAME,
s.INPUT_FORMAT,
s.OUTPUT_FORMAT
from TBLS tb
join DBS db
join SDS s
where tb.DB_ID = db.DB_ID
and tb.SD_ID = s.SD_ID
and db.NAME='test'
and s.INPUT_FORMAT like '%TextInputFormat%'
and tb.TBL_ID not in (select distinct TBL_ID from PARTITION_KEYS);
- 查询指定库分区大小
select d.NAME,t.TBL_NAME,p.PART_NAME,prm.PARAM_KEY,prm.PARAM_VALUE
from TBLS t
left join DBS d on t.DB_ID = d.DB_ID
left join PARTITIONS p on t.TBL_ID = p.TBL_ID
left join PARTITION_PARAMS prm on p.PART_ID=prm.PART_ID
where d.NAME='test'
and t.TBL_NAME='test_sms_log'
and p.PART_NAME like 'event_day=20190402/event_hour=%'
and prm.PARAM_KEY = 'totalSize';
- 查询分区信息
select d.NAME,t.TBL_NAME,p.PART_NAME,p.PART_ID
from TBLS t
left join DBS d on t.DB_ID = d.DB_ID
left join PARTITIONS p on t.TBL_ID = p.TBL_ID
where d.NAME='test'
and t.TBL_NAME='test_sms_log';
- 查询某个表有多少行
select a.TBL_ID, a.TBL_NAME, b.PARAM_KEY, b.PARAM_VALUE
from TBLS as a join TABLE_PARAMS as b
where a.TBL_ID = b.TBL_ID and TBL_NAME="test_sms_log" and PARAM_KEY="numRows";
- 查看指定表的字段信息
select COLUMNS_V2.*
from COLUMNS_V2,SDS, TBLS
where COLUMNS_V2.CD_ID = SDS.CD_ID and SDS.SD_ID = TBLS.SD_ID and TBLS.TBL_NAME='test_sms_log';
- 业务需求,监测指定数据库下的分区表是否成功创建指定分区,例如:监测test库下的分区表test_sms_log的dt=20190424是否成功创建。
需要涉及的表 DBS TBLS PARTITIONS PARTITION_KEY_VALS
-- 1-查询指定数据库中的分区表
select
db.NAME, -- 数据库名称
tb.TBL_NAME, -- 表名称
pk.PKEY_NAME, -- 分区字段名称
pk.INTEGER_IDX -- 分区字段顺序
from
TBLS tb
join
DBS db
join
PARTITION_KEYS pk
where
tb.DB_ID = db.DB_ID
and tb.TBL_ID=pk.TBL_ID
and db.NAME='test' ;
-- 2-从上表中查询hive中最细粒度的分区
select * from
(
select
db.NAME, -- 数据库名称
tb.TBL_NAME, -- 表名称
pk.PKEY_NAME, -- 分区字段名称
pk.INTEGER_IDX -- 分区字段顺序
from
TBLS tb
join
DBS db
join
PARTITION_KEYS pk
where
tb.DB_ID = db.DB_ID
and tb.TBL_ID=pk.TBL_ID
and db.NAME='test' ;
) temp
where INTEGER_IDX=MAX(INTEGER_IDX);
-- 3-从PARTITION_KEY_VALS 查询出part_id,integer_idx
select
PART_ID,INTEGER_IDX from PARTITION_KEY_VALS
where
PART_KEY_VAL='20190424'; -- 查询某一天的分区
-- 从partition系列的表中查询出表id
select
TBL_ID
from
PARTITIONS
WHERE
PART_ID
in (select PART_ID from (select
PART_ID,INTEGER_IDX from PARTITION_KEY_VALS
where
PART_KEY_VAL='20190424'));
--4-3表关联DBS查询出指定数据库中的表
select TBL_ID,DB_ID
from
(
select
TBL_ID
from
PARTITIONS
WHERE
PART_ID
in (select PART_ID from (select
PART_ID,INTEGER_IDX from PARTITION_KEY_VALS
where
PART_KEY_VAL='20190424'))
) temp
join
(select TBL_ID,DB_ID from TBLS where DB_ID='test') temp2
on
temp.TBL_ID=temp2.TBL_ID;
--5-使用第2步骤表和第4步骤的表进行left join,过滤出右表的TBL_ID is null就是那个表没有成功创建分区
代码略,自行整合测试即可。
思路大致如此。
参考博客:快速查询hive数据仓库表中的总条数
Hive 查询元数据库获取某个分区的count数
hive元数据库表分析及操作