数仓--Hive--元数据的一些查询

可以通过查询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元数据库表分析及操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。