首页 > 其他 > 详细

Hive分桶bucket

时间:2019-11-20 20:06:49      阅读:72      评论:0      收藏:0      [点我收藏+]

数据分桶的原理:

按照分桶字段的hash值去模除以分桶的个数

对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:
1、提高join查询效率

  获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

2、方便抽样

  使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

创建数据分桶表

create table emp_bucket (
empno int, 
ename string, 
job string, 
mgr int,
hiredate string, 
sal float, 
comm float, 
deptno int)
clustered by (empno)  --按照empno分桶
sorted  by (empno)   --按照empno排序
into 4 buckets     --分成4个桶
row format  delimited fields terminated by \t;  --每个字段以制表符分割
lines terminated by ‘\n‘ stored as textfile; --可以省略不写,行分割和数据格式

 

插入数据之前设置如下参数,以强制hive的reducer数目为分桶数。如果不设置这个hive参数,最后的桶个数可能不是建表语句中的个数。

 set hive.enforce.bucketing=true 

 

将数据插入到分桶表

不能采用load data [local] inpath ‘/home/emp.txt‘ into table emp_bucket这种写法,这种写法没有分桶,hive的目录下只有一个txt物理数据。

正确插入数据的方法是:

从hdfs或本地磁盘中load数据,导入中间表,然后通过从中间表查询的方式的完成数据导入。

假设现在已经有了中间表emp,通过查询emp表导入数据到分桶表

insert [overwrite] into table emp_bucket select  * from db_hive.emp ;

查看数据

hive (db_hive)> dfs -cat /user/hive/warehouse/db_hive.db/emp_bucket/

 技术分享图片

 

抽样查询

tablesample是抽样语句,语法是tablesample(bucket x out of y)

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

如table总共分了4个bucket,当y=4时,4/4=1表示抽一个bucket的数据量,x表示从第几个bucket开始抽。

select * from db_hive.emp_bucket tablesample(bucket 1 out of 4 on empno )

技术分享图片

Hive分桶bucket

原文:https://www.cnblogs.com/lucas-zhao/p/11900287.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!