数据采样
分桶表概述:
分桶就是分文件, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终翻译的MR也就会运行多少个reduce程序(HIVE的分桶本质上就是MR的分区操作)
如何向桶表添加数据
创建一个分桶表
create table 表名(
字段 类型,
....
)
clustered by(分桶字段) [sorted by (字段 [asc | desc])] into N buckets
-- 定义分桶表核心语句
row format......
添加数据
insert into|overwrite + select 将数据添加到桶表
现有一个文本文件数据, 需要加载到分桶表,如何解决呢?
第一步: 基于桶表创建一张临时表, 此表和桶表保持相同字段, 唯一区别, 当前这个表不是一个桶表
第二步: 将数据先加载到这个临时表中
第三步: 基于临时表, 使用 insert into|overwrite + select 将数据添加到桶表
注:在CDH中默认开启了一个参数, 是禁止采用load data方式向桶表添加数据的: set hive.strict.checks.bucketing = true;
桶表的作用
1.进行数据采样工作
当表的数据量比较庞大的时候, 在编写SQL语句后, 需要首先测试 SQL是否可以正常的执行, 需要在表中执行查询操作, 由于表数据量比较庞大, 在测试一条SQL的时候整个运行的时间比较久, 为了提升测试效率, 可以整个表抽样出一部分的数据, 进行测试
校验数据的可行性(质量校验)
进行统计分析的时候, 并不需要统计出具体的指标, 可能统计的都是一些相对性指标, 比如说一些比率(合格率)问题, 此时可以通过采样处理
2.提升查询的效率
可以减少JOIN次数, 从而提升效率
如何采样
采样函数: tablesample(bucket x out of y [on column])
使用位置:紧紧跟在表名的后面, 如果表名有别名, 必须放置别名的前面
说明:
x: 从第几个桶开始进行采样;
y: 抽样比例; column: 分桶的字段, 可以省略
注意:
1. x 不能大于 y;
2. y 必须是表的分桶数量的倍数或者因子
案例:
1) 假设 A表有10个桶, 请分析, 下面的采样函数, 会将那些桶抽取出来呢?
tables