分区针对的是数据的存储路径;分桶针对的是数据文件。
(1)创建分桶表
create table stu_buck(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by '\t';(2)设置分桶属性
打开分桶机制
set hive.enforce.bucketing=true;让reducer的个数与定义分桶表时设置的分桶数相同
set mapreduce.job.reduces=-1;(3)导入数据 不要用local 来导入,因为这是把一个文件put到hdfs的数据库目录下,而我们分桶需要多个文件,这样就失去分桶意义
insert into table stu_buck select id, name from stu;对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结 果。Hive 可以通过对表进行抽样来满足这个需求。
语法 tablesample(bucket x out of y) x 表示从哪个 bucket 开始抽取 y 表示从x开始间隔y个桶取一个桶出来
注意事项 y 必须是 table 总 bucket 数的倍数或者因子 x 的值必须小于等于 y 的值
比如一共有4个桶 x=1 y=2 我取1、3这两个桶出来 再比如一共有8个桶 x=2 y=4 我就取2、6这两个桶出来(y不能取3,因为8/3有余数)
select * from stu_buck tablesample(bucket 1 out of 1 on id);表示我拿出所有桶的数据