hive中有关分桶

首先,在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.而分区表的概念,是新概念,分区代表的数据的仓库,也就是文件夹目录,每个文件夹下面可以放不同

的数据文件,通过文件夹可以查询里面存放的文件,但文件夹本身和数据的内容毫无关系。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值