数据分桶的原理:
按照分桶字段的hash值去模除以分桶的个数
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
1、提高join查询效率
保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
2、方便抽样
使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
创建数据分桶表
create table emp_bucket (
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal float,
comm float,
deptno int)
clustered by (empno) --按照empno分桶
sorted by (empno) --按照empno排序
into 4 buckets --分成4个桶
row format delimited fields terminated by '\t'; --每个字段以制表符分割
lines terminated by '\n' stored as textfile; --可以省略不写,行分割和数据格式
插入数据之前设置如下参数,以强制hive的reducer数目为分桶数。如果不设置这个hive参数,最后的桶个数可能不是建表语句中的个数。
set hive.enforce.bucketing=true
将数据插入到分桶表
不能采用load data [local] inpath '/home/emp.txt' into table emp_bucket这种写法,这种写法没有分桶,hive的目录下只有一个txt物理数据。
正确插入数据的方法是:
从hdfs或本地磁盘中load数据,导入中间表,然后通过从中间表查询的方式的完成数据导入。
假设现在已经有了中间表emp,通过查询emp表导入数据到分桶表
insert [overwrite] into table emp_bucket select * from db_hive.emp ;
查看数据
hive (db_hive)> dfs -cat /user/hive/warehouse/db_hive.db/emp_bucket/
抽样查询
tablesample是抽样语句,语法是tablesample(bucket x out of y)
y必须是table总bucket(这个是4)的倍数或者因子,hive根据y的大小,决定抽样的比例,
如table总共分了4个bucket,当y=4时,4/4=1表示抽一个bucket的数据量,x表示从第几个bucket开始抽。
select * from db_hive.emp_bucket tablesample(bucket 1 out of 4 on empno )