hive元数据表tbls、parts、sds

说明

hive原数据表中sd_id在tbls、parts表中都存在,那么何时存在tbls表中存sd_id,何时在parts表中存呢?本文浅析。

1. tbls

hive> desc xxxdb.hive_mysql_tbls;
OK
col_name	data_type	comment
tbl_id              	bigint
create_time         	int
db_id               	bigint
last_access_time    	int
owner               	varchar(767)
retention           	int
sd_id               	bigint
tbl_name            	varchar(128)
tbl_type            	varchar(128)
view_expanded_text  	string
view_original_text  	string

2. partitions

 > desc xxxdb.hive_mysql_partitions;
OK
col_name	data_type	comment
part_id             	bigint
create_time         	int
last_access_time    	int
part_name           	varchar(767)
sd_id               	bigint
tbl_id              	bigint

3. sds

hive> desc xxxdb.hive_mysql_sds;
OK
col_name	data_type	comment
sd_id               	bigint
cd_id               	bigint
input_format        	varchar(4000)
is_compressed       	boolean
is_storedassubdirectories	boolean
location            	varchar(4000)
num_buckets         	int
output_format       	varchar(4000)
serde_id            	bigint
Time taken: 0.079 seconds, Fetched: 9 row(s)

在已知路径sds.location的情况下,查对应的table、db,怎么查呢?
既要从tbls表中,又要从partitions表中查,原因是sds_id可能存在tbls中,也可能存在partitions中:

  • 对于非分区表:tbls -> (sd_id) <- sds
  • 对于分区表:tbls-> (tbl_id) <- partitions -> (sd_id) <- sds

原因是,非分区表,在表级目录下,直接存文件;对于非分区表,文件是存在每个分区目录下的。

所以,想要tblssd联系起来,必须要一个子查询:

(
    select 
    	c.db_id,
    	c.tbl_name,
    	case when d.part_id is null then c.sd_id
    	when d.part_id is not null then d.sd_id
    	end as sdid
    from xxxdb.hive_mysql_tbls c 
    left join xxxdb.hive_mysql_partitions d 
    on c.tbl_id = d.tbl_id
) as e
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值