Hive分桶表

52 篇文章 2 订阅
1、分桶表建表
drop table xxxxxx_uid_online_buck;
create table xxxxxx_uid_online_buck(
  `datehour` string, 
  `halfhourtype` string, 
  `uid` string, 
  `roomid` string, 
  `roomcreatoruid` string, 
  `staytime` string)
clustered by(uid) 
sorted by(uid ASC)
into 4 buckets
row format delimited
fields terminated by ',';
2、设置分桶参数
set hive.enforce.bucketing = true;
Hive有些版本不支持,报错:Query returned non-zero code: 1, cause: hive configuration hive.enforce.bucketing does not exists.
set mapreduce.job.reduces=4;
3、向分桶表插入数据
insert into table xxxxxx_uid_online_buck
select datehour,halfhourtype,uid,roomid,roomcreatoruid,staytime from xxxxxx_uid_online distribute by(uid) sort by(uid asc);

insert overwrite table xxxxxx_uid_online_buck
select datehour,halfhourtype,uid,roomid,roomcreatoruid,staytime from xxxxxx_uid_online distribute by(uid) sort by(uid asc);

insert overwrite table xxxxxx_uid_online_buck
select datehour,halfhourtype,uid,roomid,roomcreatoruid,staytime from xxxxxx_uid_online cluster by(uid);

insert overwrite table xxxxxx_uid_online_buck
select datehour,halfhourtype,uid,roomid,roomcreatoruid,staytime from xxxxxx_uid_online cluster by(uid) sort by(uid); 报错,cluster 和 sort 不能共存
开始往创建的分通表插入数据( 插入数据需要是已分桶, 且排序的)
可以使用 distribute by(uid) sort by(uid asc)
排序和分桶的字段相同的时候也可以使用 Cluster by(字段)
注意使用cluster by 就等同于分桶+排序(sort)

4、查看分桶表的数据文件
hive> dfs -ls /user/hive/warehouse/xxxxxx_uid_online_buck;
5、数据取样查询
SELECT * FROM xxxxxx_uid_online_buck TABLESAMPLE(bucket 1 out of 2 on uid);
SELECT * FROM xxxxxx_uid_online_buck TABLESAMPLE(bucket 1 out of 4 on uid) limit 100;
6、分桶表理解和说明
对于每一个表(table)或者分区, Hive可以进一步组织成桶
,也就是说 桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
(1)获得更高的查询处理效率。
桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在相同列(包含连接列的)上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作:对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作,那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
分桶:如果我们根据某列进行分桶,意思就是对这列的值进行hash,然后除以桶的个数再决定把这个值放到哪个桶中,当我们查询数据的时候,where 分桶列=“” 首先也会对这个条件的值进行hash,找到他所在的桶,这样的话 其他桶就不会再找避免暴力扫描,速度上也会提升
和分区区别:分区是增加实际目录,每增加一个分区就会多个目录,分桶时把一个大的文件分成多个小文件。
分桶表的作用:最大的作用是用来提高join操作的效率;但是两者的分桶数要相同或者成倍数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值