-
分桶
- 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储
- 对于 hive 中每一个表,分区都可以进一步进行分桶
- 由:列的哈希值 / (除以)桶的个数
- 决定每条数据划分在哪个桶中
- 与分区的区别
- 分区:多级目录、每个目录存储固定特征的文件
- 场景
- 数据抽样 (sampling)
- 开启支持分桶
- set hive.enforce.bucketing=true
- 1.X 默认是 false
- 2.x 之后没有,但是默认是支持的
- MR 运行时会根据 bucket 的个数自动分配 reduce task 个数
- 用户也可以通过 mapred.reduce.tasks 自已设置 reduce 任务个数,但分桶时不推荐使用
- 一次作业产生的桶(文件数量)和 reduce task 个数一致
- set hive.enforce.bucketing=true
使用
原本数据表
创建分桶表
创建分桶表,表中字段,以 age 字段做为(列哈希值),并指定4个分桶
向分桶表导入数据
分桶数 与 reduce task 数相同
处理后的数据
四个分桶文件
文件名显示的:0、1、2、3,其实就是分桶文件的:1、2、3、4
每个分桶文件所写入的数据
桶表抽样查询
select * from 分桶表 tablesample(bucket 1 out of 4 on columns);
tablesample 语法
百分比抽样
tablesample(40 percent); 即:40%
数据大小抽样
tablesample(20M); 即:20M的数据
行数抽样
tablesample(1000 rows); 即:1000行数据
分桶抽样
- tablesample(bucket x out of y)
- x:表示从哪个 “bucket(分桶)” 开始抽取数据
- y:必须为该表总 bucket 数的,倍数或因子
- 倍数
- 获取单个分桶中的部分数据:(总 bucket 数 / y)
- 总 bucket 4个数 除以 8 :二分之一的数据
- 也就是获取指定分桶表中的二分之一的数据
- 可能是 bug (多次尝试)
- 1个分桶表里有六条数据,y为8时正常显示3条数据,当y为12(三分之一)时应该显示2条数据,可仍然显示3条数据(找到原因再补充)
- 1个分桶表里有六条数据,y为8时正常显示3条数据,当y为12(三分之一)时应该显示2条数据,可仍然显示3条数据(找到原因再补充)
- 可能是 bug (多次尝试)
- 获取单个分桶中的部分数据:(总 bucket 数 / y)
- 因子
- 获取指定分桶表个数:(总 bucket 数 / y)
- 总 bucket 4个数 除以 2 :2个分桶表
- 也就是一共获取 2个分桶表的数据
- 当 y 是因子时,两个分桶表是跳表的方式
- x 是 1,y 是 2 (x+y)
- 1 和 3 分桶表的所有数据
- 获取指定分桶表个数:(总 bucket 数 / y)
- 倍数