说明
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
原因是,非分区表,在表级目录下,直接存文件;对于非分区表,文件是存在每个分区目录下的。
所以,想要tbls
和sd
联系起来,必须要一个子查询:
(
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,转载请注明来源!