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明细层开始分桶。