hive分桶(hive为什么要分桶、分桶和分区的区别、分桶表的具体操作、如何将mysql中不是分桶的数据导入到分桶表中)

4、hive分桶

分桶是将数据集分解成更容易管理的若干部分的一个技术,是比分区更细粒度的数据范围划分

4.1、为什么要分桶

1、对于分区数量过于庞大、找不到合理的分区字段的时候,可以使用分桶

2、分区中的数据进一步拆分为桶:采用哈希值将数据打散,然后分发到不同的桶中来完成分桶的工作

3、分桶的计算方式:hive使用分桶所用的值进行hash,并用hash值得结果除以桶的个数做取余运算的方式,从而保证了每个桶中有数据,但是数据条数不一定相等

4、如果两个表join的时候,两个表都是分桶表,这就意味着不用再去扫描整个表了,只需要匹配对应的桶,就可以了。该方法也可以提升效率

5、数据量足够大的情况下,分桶比分区的效率更高

4.2数据采样

在开发中,数据量大的情况下,我们为了针对开发做测试,就可以采用分桶来进行数据采样,采样得到的结果是一个具有代表性的查询结果,可以达到快速开发的目的。

4.3分桶和分区的区别

1、分桶对数据的处理比分区更加的细化,分区针对的是数据的储存路径,分桶针对的是数据文件

2、分桶是按照hash值进行切分的,相对来说比较公平,分区是按照列的值划分,容易造成数据倾斜

3、分桶、分区不干扰,分区表可以划分为分桶表

4.4分桶表的操作

#创建分桶表
create table test_buck(id int, name string)
clustered by(id) sorted by (id asc) into 6 buckets
row format delimited fields terminated by '\t';
CLUSTERED BY来指定划分桶所用列;
SORTED BY对桶中的一个或多个列进行排序;
into 6 buckets指定划分桶的个数。
分桶规则:HIVE对key的hash值除bucket个数取余数,保证数据均匀随机分布在所有bucket里。
#插入数据
-启用桶表
set hive.enforce.bucketing=true;
insert into table test_buck select id, name from temp_buck;
hive.enforce.bucketing:启用桶表,数据分桶是否被强制执行,默认false,如果开启,则写入table数据时会启动分桶。


4.5文本数据的处理

注意:对于分桶表,不能使用load data的方式进行数据插入操作,因为load data导入的数据不会有分桶结构。

如何避免针对桶表使用load data插入数据的误操作呢?

1、先创建临时表,通过load data将txt文本导入临时表

--创建临时表
create table temp_buck(id int, name string)
row format delimited fields terminated by '\t';
--导入数据
load data local inpath '/tools/test_buck.txt' into table temp_buck;

2、使用insert select 语句间接的将数据从临时表导入到分桶表

--启用桶表
set hive.enforce.bucketing=true;
--限制对桶表进行load操作
set hive.strict.checks.bucketing = true;
--insert select
insert into table test_buck select id, name from temp_buck;

4.6 hive 数据抽样判断方式

select * from table tablesample(bucket x out of y on column)

hive根据y的大小,决定抽样的比例。y必须是table总bucket数的倍数或者因子。

例如,table总共分了10份bucket,当y=2时,抽取(10/2=)5个bucket的数据,当y=10时,抽取(10/10=)1个bucket的数据。

x表示从哪个bucket开始抽取,如果需要取多个分区,以后的分区号为当前分区号加上y。

例如,table总bucket数为6,tablesample (bucket 1 out of 2),表示总共抽取(6/2=)3个bucket的数据,从第1个bucket开始,抽取第1(x)个和第3(x+y)个和第5(x+y)个bucket的数据。

注意:x的值必须小于等于y的值。否则会抛出异常:FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck。

注意:sqoop不支持分桶表,如果需要从sqoop导入数据到分桶表,可以通过中间临时表进行过度。ODS也可以不做分桶,从DWD明细层开始分桶。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值