内容纲要
概要描述
本文主要介绍,如何通过开启inceptor server的DEBUG日志查看range分区是否成功生效。一般来说集群不建议开启DEBUG日志级别,会造成hive-server2.log日志过大,仅供学习参考。
众所周知,分区表设计 Hive 分区是提高较大表的查询性能的最有效方法之一。具有分区过滤的查询将仅加载来自指定分区(子目录)的数据,因此它的执行速度比通过非分区字段过滤的普通查询快得多。
另外,分区应该是一个低基数属性,以避免非常多的分区子目录的开销。
以下是一些常用作分区键的属性:
- 按日期和时间分区:使用日期和时间(如年,月和日(甚至小时))作为数据与日期/时间列关联时的分区键,例如as load_date,business_date,run_date等
- 按位置分区:当数据与位置相关时,使用国家,地区,州和城市作为分区键
- 按业务逻辑划分分区:使用部门,销售区域,应用程序,客户等作为分区键
详细说明
- 环境准备:TDH6.0.2
1. 创建范围分区表
>DROP TABLE IF EXISTS people_torc_partition_5_buckets;
--指定borndate为分区键,id为分桶键,6个分区,每个分区3个分桶
>CREATE TABLE people_torc_partition_5_buckets(
name string DEFAULT NULL,
sex string DEFAULT NULL,
nation string DEFAULT NULL,
id string DEFAULT NULL,
--borndate string DEFAULT NULL,
phonenumber string DEFAULT NULL,
email string DEFAULT NULL,
homeaddress string DEFAULT NULL
)
PARTITIONED BY RANGE (borndate DATE) (
PARTITION before1990 VALUES LESS THAN ('1990-12-31'),
PARTITION before1995 VALUES LESS THAN ('1995-12-31'),
PARTITION before2000 VALUES LESS THAN ('2000-12-31'),
PARTITION before2005 VALUES LESS THAN ('2005-12-31'),
PARTITION before2010 VALUES LESS THAN ('2010-12-31'),
PARTITION beforemax VALUES LESS THAN (MAXVALUE)
)
clustered by (id) into 3 BUCKETS STORED AS ORC_TRANSACTION;
2. 向范围分区插入数据
--其实测试范围分区是否生效不插入数据也是一样的效果
--注意分区键要放在最后
> INSERT INTO people_torc_partition_5_buckets SELECT name,sex,nation,id,phonenumber,email,homeaddress,borndate FROM people_torc_1000w_5_buckets;
3. 将hive.log4j的print level设置为DEBUG模式
- 参考KB链接:如何调整hive日志级别为DEBUG模式
4. 打开参数开关
- SET hive.rpp.show.results = TRUE;
5. 使用过滤操作查找仅属于部分分区的记录
SELECT * FROM people_torc_partition_5_buckets WHERE borndate <'2009-12-31'
6. 在hive-server2.log日志中查找after range partition pruner的记录
可以看到根据borndate字段过滤时间小于2009-12-31的,对应该表的6个分区,只需要查询除beforemax分区以外的5个分区,所以日志里面显示after range partition pruner 5,5小于6,代表分区成功