首页 » 技术分享 » hive元数据表tbls、parts、sds

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

转载自原文链接, 如需删除请联系管理员。

原文链接:hive元数据表tbls、parts、sds,转载请注明来源!

0