hive metastore ER 图
Hive 元数据是 Hive 管理数据的根本所在,其他系统接入 Hive 也是通过元数据服务的。本篇文章主要介绍 Hive 元数据表的基本信息,元数据服务放在下篇文章讲。这里我所说的元数据特指 Hive 元数据库的表。
在企业级数仓里面,Hive 元数据非常重要,尤其是在数据治理领域,通过 Hive 元数据,我们可以更好的治理数据,了解数据的方方面面。
下面我们就开始看一下核心的几个表,最后再给大家提供一段 SQL 去实践一下如何通过 Hive 的元数据获取 Hive 表的建表(DDL)语句。
1
表信息
TBLS
记录数据表的信息,可以作为左表,去关联表的其他信息。
TABLE_PARAMS
存储Hive表的属性信息,表结构如下,就三个字段。
每个表的信息基本上都有如下属性:
COLUMNS_V2
保存表的字段信息
2
分区信息
PARTITIONS
PARTITION_PARAMS
分区的参数
参数可选值:
PARTITION_KEYS
分区字段的名字,类型,顺序
PARTITION_KEY_VALS
分区字段的值
3
数据库信息
DBS
记录数据库的信息
4
版本信息
Version
该表只能有一条记录,保存了 Hive 的版本信息。
5
存储相关
SDS
此对象包含有关属于表的数据的物理存储的所有信息,数据表的存储描述。
SD_PARAMS
该表存储Hive存储的属性信息,在创建表时候使用. 通过STORED BY
6
序列化相关,存储格式
SERDES
记录序列化和反序列化信息
SERDES_PARAM
7
自定义函数
FUNCS
记录用户的自定义函数
8
如何从元数据获取DDL语句
sql 如下,可以从元数据种获取 Hive 建表语句,xxxx 替换成表名
代码语言:javascript复制select concat('create table ',t.tbl_name,' (n',c.col_string,')',
case pk.partition_string WHEN NULL then NULL ELSE concat('npartition by (',pk.partition_string,')') end,
case se.slib when null then null else concat('nrow format serden''',se.slib,'''n') end,
case sep.serde_id when null then null else concat('WITH SERDEPROPERTIES (n',sep.params,')n') end,
'stored as inputformatn''',
s.input_format,'''noutputformatn''',
s.output_format,'nlocationn''',s.location,''';'
) as ddl_sql
from TBLS t left join (select tbl_id,group_concat(concat_ws(' ',pkey_name,pkey_type,concat("'",PKEY_COMMENT,"'"))) as partition_string from PARTITION_KEYS group by tbl_id order by integer_idx) pk on t.tbl_id = pk.tbl_id
left join DBS d on t.db_id = d.db_id
left join SDS s on t.sd_id = s.sd_id
left join SERDES se on s.serde_id = se.serde_id
left join (select serde_id,group_concat(concat_ws('=',concat('''',param_key,''''),concat('''',param_value,'''n'))) params from SERDE_PARAMS group by serde_id) sep on se.serde_id = sep.serde_id
left join (select cd_id, group_concat(concat_ws(' ',column_name,type_name,"comment",concat("'",comment,"'")) separator ',n') as col_string from COLUMNS_V2 group by cd_id order by integer_idx) c on s.cd_id = c.cd_id
WHERE t.TBL_NAME = 'xxxx'
-- and t.owner = ''
-- and d.name = ''
group by d.name, t.owner,t.tbl_name;
建议收藏备忘,接下来我会分享更多实用的内容。