create table buck(id string,name string)
clustered by (id) 加ed表示被即建表的时候已经将此表分区排序,只是一个格式
sorted by (id)
into 4 buckets
row format delimited fields terminated by ',' ;
load data local
但hdfs上还是一个整个文件
truncate table xx清空表数据,
bucket 表不会自动的去分桶
#开启分桶
set hive.enforce.bucketing=true;
#设置reduce数量和分桶数量一致
set mapreduce.job.reduces=4;
hive> insert into table buck
> select id,name from p distribute by (id)
> sort by (id) ;
distribgute 表示以什么来hashpartition 以什么来分区,前面设置了reduce数量为4
sort by每个分区内的按照什么排序
也可
insert into table buck
select id,name from p cluster by (id);
即cluster by相当与 distributed by +sort by
但后者更加灵活,如果有多个reduce sort 是每个reduce里面的数据排序
而hive的partitioner 和mr的partitioner不是一回事,
hive的partition只是把文件上传load 分开按照指定目录
而分桶clusterd by 是按照hashpartition 即mr的partitioner分的
如果直接load 上传文件,不会直接分区
而是通过从别的表查询数据然后将查询的数据按照分区放到不同的桶中 桶>分区
1 create table ordinary (id int,name string) row format delimited fields terminated by ',' ;
创建一个普通表
load data local inpath 'xxx' into(overwrite) table ordinary;
加载本地文件到普通表中
2create table buck (id int, name string) clustered by (id) sorted by (id) into 4 buckets row format delimited fields terminated by ',' ;
创建分区表
insert into table buck select id,name from ordinary cluster by(id)
分桶作用是为了join方便因为cluster distribute 根据hash算法相同的id肯定在同一个桶中,提高效率,前提两个表都必须是分桶表
如join select a.id a.name b.id b.name from a join b on a.id=b.id;
而partition 是分目录为了查询方便