在上节的内容讲述了Hive的元数据都有哪些重要的表,这些表中都有哪些字段,现在我们将系统的看一下他们的组成结构
在老师的某个生产故障背景下: CDH集群版本为5.2,Yarn出现了Bug,这个Bug在CDH5.3的版本下修复了,就没有多想就将Yarn组件升级到5.3,这时候出现了问题,由于5.3和5.2最后的Thrift协议发生了变化,除了删除Hive表以外的其他功能都正常,升级整个集群不可能,只能采取曲线救国的策略,删除指定表在Hive中的元数据,来达到删除表的效果。
根据表名和库名查询得出TBL_ID、SD_ID、PART_ID、CD_ID、SERDE_ID
SELECT
t.TBL_ID,t.SD_ID,p.PART_ID,s.CD_ID,s.SERDE_ID
FROM
(SELECT
tt.TBL_ID,tt.SD_ID
FROM
tbls tt,
dbs d
WHERE
d.DB_ID = tt.DB_ID
AND
d.`NAME` = 'DATABASE_NAME'
AND
tt.TBL_NAME = 'TABLE_NAME'
) t
LEFT JOIN sds s ON t.sd_id = s.SD_ID
LEFT JOIN `partitions` p on t.TBL_ID=p.TBL_ID按照顺序依次执行删除数据语句(要先删除子表数据)
删除partition相关的(假设有分区):
# 子表partition_params
delete from partition_params where PART_ID=
# 子表partition_key_vals
delete from partition_key_vals where PART_ID=
# 子表part_privs,part_col_stats,part_col_privs
# 一般没有数据,如有则需要删除,否则因为外键关系无法删除对应数据
part_privs,part_col_stats,part_col_privs
# 主表partitions
delete from partitions where PART_ID=删除tbls相关的
# 子表table_params
delete from table_params where TBL_ID=16
# 子表partition_keys
delete from partition_keys where TBL_ID=16
# 一般没有数据,如有则需要删除,否则因为外键关系无法删除对应数据
tbl_col_privs,tbl_privs,tab_col_stats,index_params,idxs的原理同上(注意idxs是index_params的主表)
# 主表tbls
delete from tbls where TBL_ID=16删除sds相关
# 一般没有数据,如有则需要删除,否则因为外键关系无法删除对应数据
bucketing_cols,skewed_string_list_values,skewed_col_names,skewed_values
# 子表 sd_params
delete from sd_params where SD_ID=16
# 主表
delete from sds where SD_ID=16删除cds相关
# 只有两张表
delete from columns_v2 where CD_ID=21
delete from cds where CD_ID=21删除serdes相关
# 只有两张表
delete from serde_params where SERDE_ID=16
delete from serdes where SERDE_ID=16
使用jdbc改写,只需要在外部传入数据库名和表名即可,打入jar包使用