Hive 使用分区连接表

Posted

技术标签:

【中文标题】Hive 使用分区连接表【英文标题】:Hive joining tables with partitions 【发布时间】:2020-12-04 00:24:11 【问题描述】:

我需要优化 Hive 中的查询,在该查询中我使用分区但使用两个不同的分区来连接表:

select *
from k1_core_dim_dl_tables.dl_item_dim a inner
join k1_repl_dl_tables.repl_managed_sku b on b.mds_fam_id = a.mds_fam_id
join k1_core_dim_dl_tables.dl_store_club_dim c on c.store_nbr = b.store_nbr inner
join k1_core_dim_dl_tables.dl_calendar_dim d on current_date = d.cal_dt
group by c.state_prov_cd, a.upc_nbr, a.item_nbr, a.signing_desc, a.dept_nbr, b.store_nbr, c.store_nm, d.cal_wk_nbr
limit 10;

分区是:

对于 k1_core_dim_dl_tables.dl_item_dim、k1_repl_dl_tables.repl_managed_sku 和 k1_core_dim_dl_tables.dl_store_club_dim,分区 op_cmpny_cd=WMT-K1

对于 k1_core_dim_dl_tables.dl_calendar_dim,分区 geo_region_cd=K1

【问题讨论】:

请您澄清您要实现的目标,因为不清楚您提供的分区信息与 SQL 语句的相关性是什么。您怎么知道 SQL 语句还没有达到应有的优化程度?仅当您有一个 WHERE 子句过滤定义分区逻辑的列时,分区才有意义 @NickW 我正在运行此查询,使用 Hue 从数据湖中提取数据,有人告诉我,为了减少 Hue 处理此查询所需的时间,我应该使用分区以获得更好的性能。这是我第一次使用分区,所以对我来说还没有多大意义。 【参考方案1】:

在 Hive 中,您可以按列(或一组列)对表进行分区,因此您可以按日期对事务表进行分区(如果它非常大,甚至可以按日期和小时)。如果您随后编写一个按分区列过滤的查询,它将仅扫描范围内的分区而不是整个表。因此,如果您查询交易日期 = 2020-12-04 的交易表,它只会扫描单个分区。

所以分区可以帮助提高查询性能,但它有局限性,主要是如果您通过分区列以外的任何内容过滤查询,那么您仍然需要进行全表扫描,例如查询您的事务表,其中 customer ='ABC' 且金额 > 1000 将进行全表扫描

顺便说一句 - 每个表只能有一个分区结构

希望这有帮助吗?

【讨论】:

以上是关于Hive 使用分区连接表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hive 分区表优化连接性能

如何生成hive的建表语句

从非分区表创建分区 hive 表

Hive基础知识 02

Spark 性能问题与 Hive

Presto 和 hive 分区发现