首先,在hive中为什么要分桶??
:单个分区或者表中的数据量越来越大,当分区不能更细粒度的划分数据时,
会采用分桶的技术将数据更加细粒度的划分和管理。
分区和分桶的区别:
分区:一个分区在表目录之中就是目录下的一个文件,在表中的字段因为是伪列,所以定义分区的时候应该加上
对应的字段类型。例如:
create table table_test(id int,name string)partitioned by(date string);
接下来就是分桶:
分桶:一个表或者分区,都可以进一步组织成桶,也就是说桶是更为细粒度划分、hive中的分桶采用了对列
哈希,然后除以桶的个数求余的方式决定该条记录放在哪个桶表中。例如:
create table bucketed_table (Id int ,name string)clustered by (id) sorted by (name) into 4 buckets row format
delimited fields terminated by '\t' stored as textfile;
分桶的重点函数:tablesample抽样语句,
答:y 必须是 x 的倍数或者因子,hive 根据 y 的大小,决定抽样的比例。例如,table 总共有64份,当y等于32的时候,抽取
(64/32=2)2个busket的数据,当y等于128的时候,抽取(64/128=1/2)个bucket的数据。x表示从哪个bucket开始抽取。
例如:table 的bucket数为32,tableSample(bucket 3 out of 16),表示一共抽取2个bucket数据,分别是3和16个bucket中的数据。
select * from bucketed_table tableSample(bucket x out of y on id);
分桶表的数据加载:
load data local inpath '/root/user/tableFile' into table bucket_table;
?不可以使用load data 加载,否则不会进行分桶,即使设置了强制分桶属性和reduce的个数。
只能创建临时表,insert into的形式进行加载。
结论:
1、想要达到分桶的效果,只能insert into的方式进行加载,且只需要设置:
hive.enforce.bucketing=true参数即可,与设置set mapreduce.job.reduces=4;参数无关。
2.桶的概念就是Mapreduce中分区的概念,两者完全相同。物理上每个桶就是目录里的一个文件,
一个作业产生的桶(输出文件)数量和reduce任务个数相同。
3.而分区表的概念,是新概念,分区代表的数据的仓库,也就是文件夹目录,每个文件夹下面可以放不同
的数据文件,通过文件夹可以查询里面存放的文件,但文件夹本身和数据的内容毫无关系。