2023-02-09
数据 查询 分区
Hive表在创建的时候,其实就是在HDFS的指定目录上创建的一个文件夹。如果是内部表,只能映射在数据库目录下,而如果是外部表,则可以使用location指定映射的位置。这个文件夹下的所有的数据文件,都是这个表中的数据。随着系统运行时间的累积,文件中的数据量也会越来越大。hive在进行查询的时候,每一次的查询,都会从这个目录下的所有的数据文件中进行查询。如果数据量过大的时候,这个查询将会非常的慢了。
那么,有没有什么办法可以加速这个查询的过程呢?其实,最简单的加速查询就是减少文件的扫描量即可。
我们以一个电商的订单数据表为例,表中存放着过去5年的所有的订单数据。每一次查询的时候,都需要从所有的数据文件中进行查询,数据量非常庞大,导致查询的时间会非常的长。但是,表中的5年的订单的数据,我们在查询的时候,很多的数据其实都是没有必要去查询的。其中没有任何的数据价值,反而要增加查询的文件数量。
如果我们对这些订单的数据分个类呢?例如,按照时间?
我们可以在表目录下创建若干个文件夹,例如: 2022年、2021年、2020年...,然后将不同年份的订单数据,存放到对应的文件夹里面即可。这样我们在进行数据查询的时候,如果要查询2022年的数据,是不是只需要到2022年的文件夹中查询即可,不用再查询所有的数据了,就达到了加速查询的效果了!
这,就是分区!
我们使用分区,就是将表中的数据,按照不同的维度进行归类。在进行数据查询的时候,就可以按照不同的分区的号,到指定的文件夹中进行查询即可。在上述的例子中,表目录下只创建了一层的文件夹,这就是一级分区。而有时候我们还需要在一个文件夹中创建二级文件夹,来将数据进行更加细致的归类,例如对于某一年的数据,可以按照月份再进行归类。这就是二级分区。在创建分区的时候,还可以创建三级、四级等分区,但是实际使用中,三级分区已经是比较多的分区层级了。常用的就是一级和二级分区。
分区表在创建的时候,需要使用partitioned by 来指定分区的字段。例如:
12345
create table tableName(
.......
.......
)
partitioned by (colName colType [comment '...'],...)
需要注意的是,分区字段是一个伪字段,并不会真实的存储数据,只是一个分区的标识而已。例如我们在建表的时候如下:
-- 一级分区
create table part1(
id int,
name string,
age int
)
partitioned by (dt string)
row format delimited
fields terminated by ',';
-- 二级分区
create table part2(
id int,
name string,
age int
)
partitioned by (year int, month int)
row format delimited
fields terminated by ',';
在上述的两个分区表中,dt字段、year字段、month字段等,都是分区字段。如果我们到数据文件中进行数据的查看的话,你会发现数据文件中其实并没有这个字段对应的信息。但是我们的确是可以通过desc查看表结构,能够看到这个字段。因此这个字段存在的意义,只是用来区分分区的,而并不是真实的用来映射数据的。因此我们称这样的字段为伪字段。
下一篇:Hive的UDF函数
开班时间:2021-04-12(深圳)
开班盛况开班时间:2021-05-17(北京)
开班盛况开班时间:2021-03-22(杭州)
开班盛况开班时间:2021-04-26(北京)
开班盛况开班时间:2021-05-10(北京)
开班盛况开班时间:2021-02-22(北京)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2020-09-21(上海)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2019-07-22(北京)
开班盛况Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号