如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

1. 问题背景

有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partitions 修复 HIVE 元数据与 HDFS 数据在分区上的不一致性。
怎么获取这些 hms 元数据呢?

2. 获取 HMS 元数据的方案概述

获取 HMS 元数据,大体有以下几种方案:

2.1 执行 hive sql 命令,并基于 hive sql 的返回结果,解析获取 hms元数据

相关的 hive sql 命令有:

show databases; 
show tables; 
show tables like table_name_regexp;
show create table xxx; 
DESCRIBE DATABASE EXTENDED db_name;
DESCRIBE EXTENDED|FORMATTED db_name.table_name;
DESCRIBE EXTENDED|FORMATTED db_name.table_name PARTITION partition_spec;

2.2 查询 hive 库对应的 hdfs 目录的结构信息,并基于这些结构信息,解析获取 hms 元数据

  • hdfs 目录的结构信息,包括子目录和文件名等信息,解析这些信息可以获取 HIVE 库名,表名,分区名,分区值等 hms 元数据信息。
  • 比如如果某个库中,所有分区表的分区字段名都是 part_date 且分区值都是8位数字如20230101,则可以通过如下 hdfs 命令结合 awk 命令,解析获取该hive库下所有分区表的表名:
hdfs dfs -ls -R hdfs:///user/hundsun/dap/hive | egrep part_date=[0-9]{8}$ |awk -F '/' 'BEGIN { OFS="." ;}{print $8,$9}' | uniq 

2.3 直接访问 hms 底层的 rdbms 数据库,并执行sql查询获取 hms 元数据

  • hms 底层的元数据信息,都是保存在 rdbms s数据库如mysql中的,所以我们也可以直接访问 hms 底层的 rdbms 数据库,并执行sql查询获取 hms 元数据;
  • 访问 hms 数据库并执行sql,以获取指定 HIVE 库下所有分区表,或指定HIVE库下所有分区表的所有分区,其示例命令如下:
# 获取指定HIVE库下所有分区表-访问 hms 数据库并执行sql:
select distinct d.NAME,t.TBL_NAME
from tbls t join dbs d join partitions p
on t.DB_ID=d.DB_ID and t.TBL_ID=p.TBL_ID
where d.name in ("hs_sr","hs_ods","hs_mid");
# 获取指定HIVE库下所有分区表的所有分区-访问 hms 数据库并执行sql:
select d.NAME,t.TBL_NAME,p.PART_NAME
from tbls t join dbs d join partitions p
on t.DB_ID=d.DB_ID and t.TBL_ID=p.TBL_ID
where d.name in ("hs_sr","hs_ods","hs_mid");

3 hms 元数据库的相关信息

  • 在 hms 元数据服务底层的 hms 元数据库中,保存了 hive 库/表/分区等相关元数据信息;
  • hms 元数据库的 url/数据库名/用户名/密码等信息,可以咨询集群管理员获取,其中数据库名一般默认是hive,用户名一般默认也是hive;在 cdh/cdp大数据平台中,也可以使用如下 curl 命令访问 CM API 获取: curl -u admin_uname:admin_pass “http://cm_server_host:7180/api/v19/cm/deployment”,该命令中的 admin_uname:admin_pass 是 cm 管理员的用户名和密码,其默认值可以在 CM server 节点的配置文件 /etc/cloudera-scm-server/db.properties 中获取(当 cm 和 hms 使用同一个 rdbms 数据库实例时,有时 cm 管理员也可以直接查询 hms 的元数据库 hive);


  • hms 元数据库 rdmbs中,一些核心关键的表有 dbs,tbls,PARTITIONS,SDS 等,其相关信息如下:
- table "dbs" stores the information of hive databases;
- table "TBLS" stores the information of Hive tables;
- table "PARTITIONS" stores the information of Hive table partitions;
- table "SDS" stores the information of storage location, input and output formats, SERDE etc;
- table hive.dbs has below important columns:DB_ID,NAME,DB_LOCATION_URI- tablet hive.bls has below important column:TBL_ID,DB_ID,SD_ID,TBL_NAME- table hive.partitions has below important column:PART_ID,PART_NAME,SD_ID,TBL_ID- table hive.sds has below important column:SD_ID,LOCATION- Both table "TBLS" and "PARTITIONS" have a foreign key referencing to SDS(SD_ID);
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hive是一个基于Hadoop数据仓库工具,用于处理大规模数据集。在Hive中添加分区数据是指通过创建新的分区来将数据划分成更小的部分,以提高查询性能和管理数据的灵活性。 要在Hive中添加分区数据,可以按照以下步骤进行操作: 1. 创建:首先,需要创建一个Hive来存储数据。可以使用CREATE TABLE语句定义结构,包括列名、数据类型和分区字段等信息。 2. 添加分区:在已创建的上,可以使用ALTER TABLE语句添加新的分区分区字段可以是日期、地区等信息,根据实际业务需求进行选择。 3. 加载数据:在添加分区后,可以使用LOAD DATA语句将数据加载到相应的分区中。可以将数据文件或目录路径作为LOAD DATA语句的参数,Hive将自动将数据放入正确的分区。 4. 查询分区数据:完成数据加载后,可以使用SELECT语句查询特定分区的数据。可以通过指定分区字段的值来选择查询特定分区的数据,以满足具体的业务需求。 在使用Hive添加分区数据时,需要注意以下几点: 1. 分区字段应该是中的一个列,它会将中的数据按照分区字段的值进行分类。可以根据业务需求选择合适的分区字段。 2. 添加分区后,可以执行MSCK REPAIR TABLE语句来更新分区元数据。这可以确保Hive正确识别和管理所有已添加的分区。 3. 当添加大量的分区数据时,可以考虑使用动态分区的机制。动态分区允许在将数据加载到中时自动创建新的分区,无需手动指定分区。 综上所述,通过以上步骤可以在Hive中添加分区数据,并根据实际需求进行查询和分析。通过合理使用分区技术,可以提高Hive的查询性能和数据管理效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明哥的IT随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值