Hive 分区性能

Posted

技术标签:

【中文标题】Hive 分区性能【英文标题】:Hive Partition Performance 【发布时间】:2017-11-15 14:32:58 【问题描述】:

我想问一下 。 为了查看分区性能,我需要多少条记录(以行计)?

目前,我有 200 万多条记录,并且已将表拆分为 2 个分区。 我的分区条件如下:

ADD PARTITION (year_month=’2017_07’) ADD PARTITION (year_month=’2017_08’) INSERT OVERWRITE TABLE T PARTITION (year_month='2017_07') SELECT * FROM T WHERE st_time < '2017_08_01 00:00:00.0'; INSERT OVERWRITE TABLE T PARTITION (year_month='2017_08') SELECT * FROM T WHERE st_time >= '2017_08_01 00:00:00.0';

当我尝试在分区表和非分区表之间做一些性能测试时,两个表的性能是相对相同的。 我的性能测试查询如下:

SELECT * FROM T WHERE st_time &lt; '2017_08_01 00:00:00.0'; SELECT * FROM non_part_table WHERE st_time &lt; '2017_08_01 00:00:00.0';

我错过了一些重要的点吗?

另外,分区是否适用于派生列/函数?例如。 date_format(st_time, yyyy-MM)

非常感谢任何帮助或建议。

【问题讨论】:

【参考方案1】:

两个表的性能是差不多的

您忘记了针对分区的 WHERE 子句。只有当您选择其中的数据时,分区才会提高性能。

SELECT * FROM T 
WHERE year_month = '2017_07'
-- AND st_time < '2017_08_01 00:00:00.0'
;

没有这个,您仍然在扫描整个表以查找 st_time 值。

您可以在查询中添加EXPLAIN 以查看差异

通过将数据转换为 Parquet 或 ORC,您将获得额外的性能改进

【讨论】:

您好 cricket_007,非常感谢您的帮助!分区是否适用于功能?例如。我将分区定义为 year_month = '2017_07' 并且我的表中的 year_month 列是时间戳数据类型。我在 WHERE 子句中使用 date_format(year_month, yyyy_MM),是否考虑在分区内选择数据? 您的分区已经是2017_07... date_format 的用途是什么?我的意思是,当然,像 concat('2017', '_07') 可能会工作 嗯,你说的很有道理。非常感谢您帮助我解决我的问题!先生美好的一天! 事实上,如果没有适当的WHERE 子句,partitioned 表实际上会降低读取性能。不是 @cricket_007 吗? @y2k-shubham 包含WHERE 的目的是修剪分区和扫描的数据,是吗?但是拥有一个分区表而不是基于它们进行过滤与根本没有分区没有任何不同

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

Hive 分区方案及其对性能的影响

如何处理 hive 分区以提高性能与过度分区

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

入门大数据---Hive分区表和分桶表

Hive 分区、分桶和排序表 - 多个插入

Hive性能优化之表设计优化