Hive查询一般是扫描整个目录,但有时关心的只是集中在某一部分数据,比如,查询某一天的数据,此时可以使用分区表进行优化,而将一天作为一个分区。此时查询的时候,就可以只扫描指定天的分区的数据。
区别
普通表和分区表的区别在于:一个Hive表在HDFS上有一个对应的目录来存储的,普通表的数据直接存储在这个目录下, 而分区表数据存储时,是再划分子目录来存储,一个分区一个子目录,主要是用来优化查询性能。
--创建经销商操作日志表
create table dealer_action_log
(
companyId INT comment '公司ID',
userid INT comment '销售ID',
originalstring STRING comment 'url',
host STRING comment 'host',
absolutepath STRING comment '绝对路径',
query STRING comment '参数串',
refurl STRING comment '来源url',
clientip STRING comment '客户端IP',
cookiemd5 STRING comment 'cookiemd5',
timestamp STRING comment '访问时间戳'
)
partitioned by (dt string)
row format delimited fields terminated by ','
stored as textfile;
在这个例子中,日志表以dt字段分区(dt是个虚拟字段),dt下并不存储数据,而是用来分区。
实际数据存储时,dt字段值一样的数据存入同一个子目录。
当Hive查询数据时,如果指定了dt筛选条件,那么只需要到对应的分区下去检索数据即可。