分区:
Hive使用select查询时,一般会扫描整个表的内容。那随着系统运行的时间越来越长,表的数据量越来越大,Hive在做全表扫描的时候,会消耗很多时间,降低查询效率。但是有些时候我们只是需要表中的一部分数据,所以Hive在创建表的时候就引入了Partitio(分区)概念,就是在建表的时候,将整个表存储在不同的子目录中,每一个子目录都对应一个分区,这样我们在做查询的时候就可以指定分区查询,避免了全局扫描,从而提高查询效率。
如何分区:
对于分区来说,一般情况下会根据业务需求的不同去创建不同的分区,常见的就是按照年月日进行分区,还有按照地点分区
分区的注意事项:
1.Hive的分区名不区分大小写,不支持中文
2.Hive的分区字段是伪字段,但是可以用来操作(可以查询,但是不存储实际的值)
3.一张表可以有一个或者多个分区,并且分区下面也可以有一个或多个分区
分区的语法:
create table tableName
...
...
partitioned by(分区字段)
分区的意义:
1.性能优化
2.查询效率提高:让用户在做数据查询的时候可以缩小数据扫描的范围,可以指定要扫描哪个分区的数据,这样就减少了扫描的文件数量和体积,提高我们的查询效率
3.数据生命周期管理:可以定期删除旧分区的数据,释放存储空间
分区的本质:
在表的目录下或者是分区的目录下在创建目录,目录下在创建子目录,把数据分到不同的子目录中
查询一级分区数据:
查询二级分区数据:
查询三级分区数据:
我们在做查询的时候要从最外层的一级分区开始往里精确,如果我们查2021年12月份12号的数据,那我们就要从一级分区开始往里精确,因为如果不从最外层往里精确的话,那么2019年也有十二月,2020年也有十二月,那就相当于还是做了个全表查询,这样的话分区就没有意义了,所以要从外往里一层层精确
分区的种类:
静态分区:
直接加载数据到指定的分区,需要我们手动完成
动态分区:
数据未知,根据分区的值来确定需要创建的分区(分区目录不是指定的,而是根据数据的值自动分配的),有程序来帮我们完成
严格模式:
在严格模式下,给动态分区表导入数据时,分区字段中至少要有一个字段是静态值,不严格模式下,导入数据的时候可以不用指定静态值
分区表的注意事项:
1.Hive的分区使用的是表外字段,分区字段是一个伪列
2.分区字段不建议使用中文,因为会涉及到字符集的问题
3.一般不建议使用动态分区,因为动态分区会使用MapReduce来进行数据查询,如果分区数据过多,会导致NameNode和RescourceManager的一个性能瓶颈,建议在使用动态分区前尽可能的预测分区数量
分桶:
数据分区可能会导致有些分区数据过多,有些分区数据过少。分桶是将数据集分解成若干个数据文件的一种技术,分区和分桶都是对数据进行更加细腻话的管理,当单个分区的数据量过大时,分区不能更好的管理,就要采用分桶对数据进行更加细腻的管理。
分桶的主要作用是:
数据聚合:分桶可以使数据被分成较小的存储单元,提高了数据统计和聚合的效率
均衡负载:数据经过分桶之后更容易实现均衡负载,数据可以分发到多个节点中,提高查询效率
注意事项:
从2.x版本开始,设置了强制分桶操作,也就是说人为修改的个数不会影响最终文件的个数(文件个数由桶数决定)。