目录
- 背景
- 第一部分 环境依赖
- 第二部分 交互接口
- 第三部分 任务提交
- 参考文献及资料
背景
Hive将表划分为分区(partition)表和分桶(bucket)表。分区表在加载数据的时候可以指定加载某一部分数据,并不是全量的数据,可以让数据的部分查询变得更快。分桶表通常是在原始数据中加入一些额外的结构,这些结构可以用于高效的查询
https://data-flair.training/blogs/hive-partitioning-vs-bucketing/
https://blog.csdn.net/whdxjbw/article/details/82219022
第一部分 分区
第二部分 分桶
Hive分桶是相对分区进行更细粒度的划分。是将整个数据内容按照某列取hash值,对桶的个数取模的方式决定该条记录存放在哪个桶当中;具有相同hash值的数据进入到同一个文件中。如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。
创建分桶表
在创建分桶表之前要执以下的命令,开启对分桶表的支持以及reduce个数
1 | set hive.enforce.bucketing=true; |
创建分桶表
1 | create table myhive1.user_buckets_demo(id int, name string) |
如何向分桶表中导入数据
向分桶表中导入数据,不可以直接加载,需要先导入普通表,再导入分桶表中,这种和动态分区类似。
1 | # 创建普通表 |
分桶表物理存储结构
分桶表表在hdfs上作为一个文件存在。
1 | 0: jdbc:hive2://node03:10000> dfs -ls /user/hive/warehouse/myhive1.db/user_buckets_demo; |
分桶表使用场景
- 取样sampling更高效。没有分桶的话需要扫描整个数据集。
- 提升某些查询操作效率,例如map side join
如何抽样查询桶表的数据
tablesample抽样语句语法:tablesample(bucket x out of y)
- x表示从第几个桶开始取数据
- y与进行采样的桶数的个数、每个采样桶的采样比例有关
1 | select * from user_buckets_demo tablesample(bucket 1 out of 2); |
第三部分
参考文献及资料
1、