Hive中分区和分桶

分区:

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版本开始,设置了强制分桶操作,也就是说人为修改的个数不会影响最终文件的个数(文件个数由桶数决定)。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据界一个小小的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值