元数据概念
在之前安装Hive的博客Hive从入门到放弃——Hive安装和基本使用(二) ,提到了有一步骤是初始化Hive,其实就是把Hive的元数据表创建部署在一个叫hive的MySQL库里,那么什么是元数据呢? 元数据(Metadata)
,又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。 解释解释就是你在Hive内建的库,建的表,表有哪些字段,字段类型是什么,用的什么序列化,表建了什么分区等等,这些描述Hive内数据库、表、分区、字段等对象的数据,就是Hive的元数据,细心的你可能觉得好像遇到过这些玩意,没错,一般常见的关系型数据库如SQL Server,MySQL会在自己实力本身建一个类似于sys的库和表来存这些描述库或者表的数据,但是Hive本身没有这样的库,而且经常涉及元数据本身的增删查改,还要支持多人同时多事务的增删查改这些配置元数据信息,Hive本身存这样的库不适合,所以选用了能较好支持的MySQL作为元数据库,当然Oracle和SQL Server也是可以作为选择的,但是因为MySQL免费嘛,所以用的多。
元数据表E-R图
可以自己登录到自己Hive元数据库hive内,查看一下元数据表和E-R图,hive-2.3.5
版本有57张元数据表,当然也不是所有的表都能关联到整个元数据的E-R图内,也有游离在外面的独立的表的,有些是Hive预留的,等着你去开发实践,如果你要修改Hive源码,那么必须要要对这些Hive元数据表滚瓜烂熟。
图1 查看Hive元数据表的E-R图
纵然整个E-R图,确实有点大,截图截不全,但是最重要的是两个表是表SDS(Hive序列化反序列化表)
和表TBLS(Hive表描述)
,这两个表贯穿了整个E-R图,详细我们在下文会具体说明。
图2 Hive元数据表的E-R图节选
常用元数据表简介
Hive版本相关的表
VERSION
查看版本信息,结构相对简单,但是很重要,缺失会在启动Hive连接时触发异常table ‘hive.version’ doesn’t exist
,表结构数据字典如表1。
表1 VERSION数据字段
字段名 类型 是否为空 约束 描述 样例数据 VER_ID bigint(20) N 主键 版本主键id 1 SCHEMA_VERSION varchar(127) N - Hive版本 2.3.0 VERSION_COMMENT varchar(255) Y - Hive版本说明id Hive release version 2.3.0
Hive数据库相关的表
DBS
查看所有数据库的信息,表结构数据字典如表2;
表2 DBS数据字段
字段名 类型 是否为空 约束 描述 样例数据 DB_ID bigint(20) N 主键 数据库主键id 1 DESC varchar(4000) Y - 数据库描述 数据仓库 DB_LOCATION_URI varchar(4000) N - 数据库hdfs位置 hdfs://dw-test-cluster-007/hive/warehouse NAME varchar(128) Y - 数据库名字 dw OWNER_NAME varchar(128) Y - 数据库属主(即谁的库) hadoop OWNER_TYPE varchar(10) Y - 数据库类型 ROLE或USER
DATABASE_PARAMS
存储数据库的属性相关参数,对应CREATE DATABASE
时候用WITH DBPROPERTIES (property_name=property_value, …)
指定的参数,具体如表3;
表3 DATABASE_PARAMS数据字段
字段名 类型 是否为空 约束 描述 样例数据 DB_ID bigint(20) N 主键 数据库主键id 1 PARAM_KEY varchar(180) N - 数据库属性参数名 creater或date或edited-by PARAM_VALUE varchar(4000) Y - 数据库属性参数值 rowyet或20200520
Hive表和视图相关的表
TBLS
划重点,重中之重,记录Hive表,视图和索引等基本信息描述,表结构字典如表4;
表4 TBLS数据字段
字段名 类型 是否为空 约束 描述 样例数据 TBL_ID bigint(20) N 主键 数据库主键id 1 CREATE_TIME int(11) N - 创建时间(时间戳) 1570604212 DB_ID bigint(20) Y DBS表外键 数据库ID 1 LAST_ACCESS_TIME int(11) N - 最后一次访问时间(时间戳) 1570604212 OWNER varchar(767) Y - 表属主 rowyet RETENTION int(11) N - 表保留字段 0 SD_ID bigint(20) Y SDS表外键 序列化表ID 1,对应SDS表的SD_ID=1 TBL_NAME varchar(256) Y - 表名 ods_rs_basic_area_txt TBL_TYPE varchar(128) Y - 表类型(内部表,外部表) MANAGED_TABLE VIEW_EXPANDED_TEXT mediumtext Y - 视图的详细HQL语句 select * from dw.ods_rs_basic_area_txt VIEW_ORIGINAL_TEXT mediumtext Y - 视图的原始HQL语句 select * from ods_rs_basic_area_txt IS_REWRITE_ENABLED bit(1) N - 是否重写 0
TABLE_PARAMS
表相关属性参数,对应Hive建表语句中的TBLPROPERTIES ( 'parquet.compression'='snappy', 'spark.sql.create.version'='2.2 or prior', 'spark.sql.sources.schema.numPartCols'='3', 'transient_lastDdlTime'='1590565081')
以及表的comment
的属性描述,具体表结构字典如表5,
表5 TABLE_PARAMS数据字段
字段名 类型 是否为空 约束 描述 样例数据 DB_ID bigint(20) N 主键 数据库主键id 1 PARAM_KEY varchar(256) N - 表属性参数名 comment 或 parquet.compression或transient_lastDdlTime等 PARAM_VALUE mediumtext Y - 表属性参数值 ods describe表 或 snappy 或 1571225030
TBL_PRIVS
记录Hive表、视图授权情况,具体如表6;
表6 TBL_PRIVS数据字段
字段名 类型 是否为空 约束 描述 样例数据 TBL_GRANT_ID bigint(20) N 主键 授权表主键id 1 CREATE_TIME int(11) N - 创建时间(时间戳) 1570604212 GRANT_OPTION smallint(6) N - 权限可选项 0 GRANTOR varchar(128) Y - 授权执行用户 hadoop GRANTOR_TYPE varchar(128) Y - 授权用户类型 USER PRINCIPAL_NAME varchar(128) Y - 被授权用户 hadoop PRINCIPAL_TYPE varchar(128) Y - 被授权用户类型 USER TBL_PRIV varchar(128) Y - 授予权限 SELECT 或 UPDATE 或 DELETE 或INSERT TBL_ID bigint(20) Y TBLS表外键 TBLS表的TBL_ID 1 对应TBLS的TBL_ID=1
Hive序列化和反序列化相关的表
SDS
保存表指定文件的存储相关的信息,如输入、输出格式,是否压缩,文件存储在hdfs上的位置等,数据字典具体如表7;
表7 SDS数据字段
字段名 类型 是否为空 约束 描述 样例数据 SD_ID bigint(20) N 主键 主键id 1 CD_ID bigint(20) Y CDS表外键 CDS表外键 1 INPUT_FORMAT varchar(4000) Y - 输入格式 org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat IS_COMPRESSED bit(1) N - 是否压缩 0,1 IS_STOREDASSUBDIRECTORIES bit(1) N - 是否以子目录存储 0,1 LOCATION varchar(4000) Y - 文件在HDFS的存储位置 hdfs://dw-test-cluster-007/hive/warehouse/ods/compose_plan/kuma/ods_kuma_compose_plan/event_week=40/event_day=20191010/event_hour=00 NUM_BUCKETS int(11) N - 分桶个数 7 OUTPUT_FORMAT varchar(4000) Y - 输出格式 org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat SERDE_ID bigint(20) Y SERDES外键 SERDES外键 1
SD_PARAMS
存储SDS表的一些属性,由STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)
指定,这个表不常见,我查询了下我的生产Hive元数据库,该目前是无记录的,说明这些属性实际用处不大,数据字典如表8;
表8 SD_PARAMS数据字段
字段名 类型 是否为空 约束 描述 样例数据 SD_ID bigint(20) N 主键 表SDS主键id 1 PARAM_KEY varchar(256) N - 表SDS属性参数名 - PARAM_VALUE mediumtext Y - 表SDS属性参数值 -
SERDES
存储Hive表的序列化,反序列化调用的类,非常重要,具体数据结构如表9;
表9 SERDES数据字段
字段名 类型 是否为空 约束 描述 样例数据 SERDE_ID bigint(20) N 主键 表SERDES主键id 1 NAME varchar(128) Y - 调用序列化类的别名 - SLIB varchar(4000) Y - 调用序列化的类 org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
SERDE_PARAMS
存储Hive序列化的一些属性,如文本格式的行列分隔符,二进制文件的序列化格式等,数据字典如表10;
表10 SERDE_PARAMS数据字段
字段名 类型 是否为空 约束 描述 样例数据 SERDE_ID bigint(20) N 主键 表SERDE_PARAMS主键id 1 PARAM_KEY varchar(256) N - 表SERDE_PARAMS属性参数名 field.delim 或 line.delim 或 serialization.format PARAM_VALUE mediumtext Y - 表SERDE_PARAMS属性参数值 或 换行符 或 1
Hive表字段相关的表
COLUMNS_V2
存储字段相关的信息,很重要,数据字典如表11;
表11 COLUMNS_V2数据字段
字段名 类型 是否为空 约束 描述 样例数据 CD_ID bigint(20) N 主键 表COLUMNS_V2主键id 1 COMMENT varchar(256) Y - Hive表字段描述 账号类型 COLUMN_NAME varchar(767) N - Hive表字段名称 account_type TYPE_NAME mediumtext Y - Hive表字段类型 string INTEGER_IDX int(11) N - Hive表字段顺序 13
扩展:元数据表内获取表字段的方法,可以通过上面图2的E-R图关系获得,表TBLS
的字段SD_ID
关联表SDS
,然后表SDS
的字段CD_ID
关联表CDS
,然后表CDS
的字段CD_ID
关联表COLUMNS_V2
得到,可参看以下sql语句 ;
select t1. TBL_NAME, t4. *
from TBLS t1
inner join SDS t2 on t1. SD_ID= t2. SD_ID
inner join CDS t3 on t2. CD_ID= t3. CD_ID
inner join COLUMNS_V2 t4 on t3. CD_ID= t4. CD_ID
where TBL_NAME= 'ods_fso_tb_e_sales_publish'
运行结果如图3 ;
图3 元数据实现查看某表的字段
Hive表分区相关表
PARTITIONS
存储Hive表的分区信息,数据字典如表12;
表12 PARTITIONS数据字段
字段名 类型 是否为空 约束 描述 样例数据 PART_ID bigint(20) N 主键 表PARTITIONS主键id 1 CREATE_TIME int(11) N - 分区创建时间 1570775393 LAST_ACCESS_TIME int(11) N - 最后一次访问时间 0 PART_NAME varchar(767) Y - 分区名 event_week=40/event_day=20191010/event_hour=00 SD_ID bigint(20) Y SDS表外键 分区存储ID 62 TBL_ID bigint(20) Y TBLS表外键 表ID 28
PARTITION_KEYS
存储Hive表的分区字段名字,类型,数据字典如表13;
表13 PARTITION_KEYS数据字段
字段名 类型 是否为空 约束 描述 样例数据 TBL_ID bigint(20) N 主键 表COLUMNS_V2主键id 1 PKEY_COMMENT varchar(4000) Y - 分区字段说明 天 PKEY_NAME varchar(128) N - 分区字段名 event_day PKEY_TYPE varchar(767) N - 分区字段类型 string INTEGER_IDX int(11) N TBLS表外键 分区字段顺序 1
PARTITION_KEY_VALS
存储Hive表分区字段的值,数据字典如表14;
表14 PARTITION_KEY_VALS数据字段
字段名 类型 是否为空 约束 描述 样例数据 PART_ID bigint(20) N 主键 表PARTITION_KEY_VALS主键id 1 PART_KEY_VAL varchar(256) Y - 分区字段的值 20191010 INTEGER_IDX int(11) N - 分区字段顺序 1
PARTITION_PARAMS
存储Hive表分区的属性,数据字典如表15;
表15 PARTITION_PARAMS数据字段
字段名 类型 是否为空 约束 描述 样例数据 PART_ID bigint(20) N 主键 表PARTITION_PARAMS主键id 1 PARAM_KEY varchar(256) N 主键 分区属性名 numFiles 或 numRows PARAM_VALUE varchar(4000) Y 主键 分区属性值 15 或 502195
扩展:元数据表内获取表分区的方法,可以通过上面图2的E-R图关系获得,表TBLS
的字段TBL_ID
关联表PARTITIONS
和表PARTITION_KEYS
,然后表PARTITION_KEY_VALS
的字段PART_ID
关联表PARTITION_KEY_VALS
,关联表PARTITION_PARAMS
是为了取属性,可选,一般不用,可参看以下sql语句 ;
select t1. TBL_NAME, t2. PKEY_COMMENT, t2. PKEY_NAME, t2. PKEY_TYPE, t2. INTEGER_IDX, t3. PART_NAME, t3. PART_ID
, t4. PART_ID, t4. PART_KEY_VAL, t4. INTEGER_IDX
from TBLS t1
inner join PARTITION_KEYS t2 on t1. TBL_ID= t2. TBL_ID
inner join PARTITIONS t3 on t1. TBL_ID= t3. TBL_ID
inner join PARTITION_KEY_VALS t4 on t3. PART_ID= t4. PART_ID and t2. INTEGER_IDX= t4. INTEGER_IDX
where t1. TBL_ID= 28
运行结果如图4 ;
图4 元数据实现查看某表的分区信息
其他不常用元数据节选
hive-2.3.5
版本有57张元数据表,以上列出的是比较常用的一些,剩下的就不详细列举了,大家还是要学会利用图2的E-R图来盘清楚这些元数据表的关系,同时对于有修改Hive源码的小伙伴们,也是需要先理清楚这些元数据表的。
DB_PRIVS
数据库权限信息表。通过GRANT语句对数据库授权后,将会在这里存储。
IDXS
索引表,存储Hive索引相关的元数据
INDEX_PARAMS
索引相关的属性信息。
TAB_COL_STATS
表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里。
TBL_COL_PRIVS
表字段的授权信息
PART_PRIVS
分区的授权信息
PART_COL_STATS
分区字段的统计信息。
PART_COL_PRIVS
分区字段的权限信息。
FUNCS
用户注册的函数信息
FUNC_RU
用户注册函数的资源信息