一文搞懂 Hive 元数据的表,数仓开发需要熟悉的,建议收藏

2022-11-08 13:54:14 浏览数 (1)

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;

建议收藏备忘,接下来我会分享更多实用的内容。

0 人点赞