分享

[疑问]Hive中分区和分桶查询时,有什么区别?

xingoo 发表于 2016-8-25 11:23:57 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 4 20078
如题,按照我的理解,分区是以文件目录为基础,如果是动态分区,分区的数量将会很多。
而分桶则是固定的数目,数据会按照某种hash规则分到某个桶里面,不会造成数据大小的波动。


问题来了:
分区的字段也是表中的字段,因此在where a=xxx的时候,通过分区字段可以极快的过滤到很多hdfs文件。

那么分桶时,查询的过程是什么样的?为什么比全表查询快?

已有(4)人评论

跳转到指定楼层
einhep 发表于 2016-8-25 19:38:32
分桶时,查询的过程是什么样的?为什么比全表查询快?
当从桶表中进行查询时,hive会根据分桶的字段进行计算分析出数据存放的桶中,然后直接到对应的桶中去取数据,这样做就很好的提高了效率。


对于每一个表或者是分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive是针对某一列进行分桶。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中分桶的好处是可以获得更高的查询处理效率

下图分桶示意图
1.png

总之为什么分桶效率高:应该说是对数据的精确定位,所以快。

分桶时注意开启桶表
set hive.enforce.bucketing = true;  





回复

使用道具 举报

xingoo 发表于 2016-8-26 23:27:45
einhep 发表于 2016-8-25 19:38
分桶时,查询的过程是什么样的?为什么比全表查询快?
当从桶表中进行查询时,hive会根据分桶的字段进行计 ...

完美的解答~
回复

使用道具 举报

xingoo 发表于 2016-8-30 11:19:53
einhep 发表于 2016-8-25 19:38
分桶时,查询的过程是什么样的?为什么比全表查询快?
当从桶表中进行查询时,hive会根据分桶的字段进行计 ...

分桶可不可以理解成HashMap,那么如果按照userid进行分桶,有一个userid有80%的数据,其他的userid总共才20%。那么会不会存在数据倾斜的问题?
回复

使用道具 举报

einhep 发表于 2016-8-31 19:12:58
xingoo 发表于 2016-8-30 11:19
分桶可不可以理解成HashMap,那么如果按照userid进行分桶,有一个userid有80%的数据,其他的userid总共才 ...

个人理解应该不会数据倾斜,应该是指不同的机器之间。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条