Hive 分区表查询优化

Posted

技术标签:

【中文标题】Hive 分区表查询优化【英文标题】:Hive partition table query optimisation 【发布时间】:2020-06-02 22:01:55 【问题描述】:

我是 hive 和 hadoop 生态系统的新手。根据我对 Hive 基础知识的了解,您可以根据某些属性在 hive 表上创建分区。如果查询中提到了该属性,那么它应该应该获得性能提升,因为 hive 只扫描特定的分区文件而不是扫描整个表。我的问题是假设我们在数据中有一些层次结构。假设我根据唯一的状态值对表进行分区,并且每次查询都基于state hive 只会扫描特定的 state 分区,而不是扫描整个 table。但是说每个 state 也有唯一的区名称。如果我只根据区值进行查询,hive 会扫描整个 table?

如果是这样,那么是否可以通过某种方式更改查询,以便我可以手动指示 hive 查询该区域所属的特定状态文件。然后仅对该分区文件执行其他操作,而不是扫描整个表以查找匹配的地区值。

【问题讨论】:

【参考方案1】:

Hive 的优势之一是它对分区的强大支持。但是,它无法在您编写查询时读懂您的想法。

如果您在state 上有一个分区,那么您需要在where 子句中使用state 进行分区修剪。因此,如果您只查询district,则会扫描整个表。

如果您在district 上有一个分区,那么您需要该分区。对state 的查询将扫描整个表。

如果您在两个 . . .好吧,那么声明起来会稍微复杂一些,但是您的查询会读取带有statedistrict 的少数分区。

如果您只是学习分区,我建议您从日期分区开始。这些是熟悉该概念的最常见和最好的方法。

【讨论】:

我已经根据唯一的状态值对文件进行了分区。我的建议是如果用户对区进行查询。我希望 hive 获取该区所属的匹配状态分区。我尝试做一些事情类似的方法是首先在该选定状态分区上创建一个视图,然后在该视图上运行实际查询。它在查询时间方面显示出一点改进,但​​是由于构建表的原始 csv 文件很小(26mb )。我猜是获取整个表而不是分区的时间,没有太大区别?我的方法应该是什么?

以上是关于Hive 分区表查询优化的主要内容,如果未能解决你的问题,请参考以下文章

Hive优化:严格模式

Hive入门 优化总结

工作常用之Hive 调优HQL 语法优化

工作常用之Hive 调优HQL 语法优化

工作常用之Hive 调优HQL 语法优化

hive 插入parquet二级分区表数据倾斜优化