Hive元数据说明与应用

770 阅读2分钟

一、Hive数据存储

1、底层数据

  • 底层数据存储在分布式存储(HDFS)中。

2、元数据

  • 元数据信息维护在MetaStore。
  • Hive默认使用的元数据存储数据库是Derby,Derby不支持多个客户端同时访问,所以需要对Derby进行替换,一般常用MySQL替换Derby。

二、Hive相关元数据表

1、Hive版本表

(1) version表

字段含义
VER_IDid主键
SCHEMA_VERSIONHive 版本
VERSION_COMMENT版本说明

2、数据库表

(1) DBS表

字段含义
DB_ID数据库ID
DESC数据库描述
DB_LOCATION_URI数据库HDFS路径
NAMEHive数据库名
OWNER_NAMEHive数据库所有者用户名
OWNER_TYPEHive所有者角色

3、表和视图表

(1) TBLS表

字段含义
TBL_ID表ID
CREATE_TIME创建时间
DB_ID数据库ID
LAST_ACCESS_TIME上次访问时间
OWNER所有者
RETENTION保留字段
SD_ID序列化配置信息
TBL_NAME表名
TBL_TYPE表类型
VIEW_EXPANDED_TEXT视图的详细HQL
VIEW_ORIGINAL_TEXT视图的原始HQL

(2) TTABLE_PARAMS表

字段含义
TBL_ID表ID
PARAM_KEY表属性名
PARAM_VALUE表属性值

4、文件存储表

(1) SDS表

字段含义
SD_ID存储信息ID
CD_ID字段信息ID
INPUT_FORMAT文件输入格式
IS_COMPRESSED是否压缩
IS_STOREDASSUBDIRECTORIES是否以子目录存储
LOCATIONHDFS路径
NUM_BUCKETS分桶
OUTPUT_FORMAT文件输出格式
SERDE_ID序列化类ID

(2) SERDES表

字段含义
SERDE_ID序列化类配置ID
NAME序列化类别名
SLIB序列化类

(3) SERDE_PARAMS表

字段含义
SERDE_ID序列化类配置ID
PARAM_KEY属性名
PARAM_VALUE属性值

5、字段表

(1) COLUMNS_V2表

字段含义
CD_ID字段信息ID
COMMENT字段注释
COLUMN_NAME字段名
TYPE_NAME字段类型
INTEGER_IDX字段顺序

6、分区表

(1) PARTITIONS表

字段含义
PART_ID分区ID
CREATE_TIME分区创建时间
LAST_ACCESS_TIME最后一次访问时间
PART_NAME分区名
SD_ID分区存储ID
TBL_ID表ID

(2) PARTITION_KEYS表

字段含义
TBL_ID表ID
PKEY_COMMENT分区字段名说明
PKEY_NAME分区字段名
PKEY_TYPE分区字段类型
INTEGER_IDX分区字段顺序

(3) PARTITION_KEY_VALS表

字段含义
PART_ID分区ID
PART_KEY_VAL分区字段值
INTEGER_IDX分区字段顺序

(4) PARTITION_PARAMS表

字段含义
PART_ID分区ID
PARAM_KEY分区属性名
PARAM_VALUE分区属性值

三、应用

1、根据传入的tablename删除元数据所有信息

  • (1) 存储过程:

  • 存储过程名字为t1,输入为tbl_id

  •   DELIMITER // 
      drop procedure if exists t1;
      create  procedure t1 ( in tbinput int) 
      begin
          declare v_sd_id int ;
          declare v_part_id int ;
          declare v_cd_id int ;
          declare v_serde_id int ;
    
          select tbinput;
          select SD_ID into v_sd_id from tbls where TBL_ID = tbinput;
          select part_id  into v_part_id from partitions where tbl_id = tbinput;
          select cd_id , serde_id into v_cd_id,v_serde_id from sds where sd_id = v_sd_id;
          select v_sd_id,v_part_id,v_cd_id,v_serde_id;
    
          if v_part_id is not  null then 
              delete from partition_params where part_id = v_part_id;
              delete from partition_key_vals where part_id = v_part_id;
          end if;
    
          delete from serdes where serde_id = v_serde_id;
          delete from serde_params where serde_id = v_serde_id;
          delete from columns_v2 where cd_id = v_cd_id;
          delete from sds where sd_id = v_sd_id;
          delete from partitions where tbl_id = tbinput;
          delete from partition_keys where tbl_id = tbinput;
          delete from table_params where tbl_id = tbinput;
          delete from tbls where tbl_id = tbinput;
      end ;
      //
      delimiter ; 
    
      mysql> call t1(tbl_id);
    
  • (2) shell封装:

  •   hive_mysql_delete.sh 
      #!/bin/bash
      source /usr/local/mysql/.bash_profile
      mysql -uroot -p密码 hive数据库 -e "
      SET FOREIGN_KEY_CHECKS = 0; 
      call t1(tbl_id);  
      SET FOREIGN_KEY_CHECKS = 1;
      quit" >> /tmp/mysql_delete.log