【二十一】hive桶表

Bucketed Sorted Tables(桶表)

理论

桶表是对数据进行哈希取值,然后放到不同文件中存储。

数据加载到桶表时,会对字段取hash值,然后与桶的数量取模

物理上,每个桶就是表(或分区)目录里的一个文件

分桶表加载数据不能使用load。

采用桶能够带来一些好处:

1.提升查询效率

比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。

那么将保存相同列值的桶进行JOIN操作就可以,可以大大减少JOIN的数据量。

但是这是需要一定条件的,否则JOIN出来的结果是不正确的:

A表的桶的个数必须是B表的倍数或者因子,也就是说B表100各个桶,那么A表可以是200,300或者10,20,25,50

因为分桶会对该列进行hash,然后根据桶的数量取余计算每一个记录落在哪一个桶。

比如A表4个桶,B表5个桶,那么假设hash取余之后的数A表肯定是0,1,2,3 那么B表的话则是0,1,2,3,4

假设hashcode得到的值为8,那么在A表,这条数据就落在0这个桶内,而在表则会落在3这个桶内.

2.抽样时更快

使用

创建

例子:按照dt,country字段分区,再按照userid字段分桶,一共32个桶,每个桶中按照viewTime字段排序。

桶是比分区更细的粒度。分桶是在分区下进行的

使用分桶,用户在写数据的时候reducer的数量要和桶的数量一样。读的时候要用CLUSTER BY and SORT BY命令。

桶中的数据可以根据一个或多个列另外进行排序。由于这样对每个桶的连接变成了高效的归并排序(merge-sort),

CREATE TABLE page_view(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(dt STRING, country STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

STORED AS parquet;

 

创建insert select用的表

CREATE TABLE page_view_select(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User')

COMMENT 'use for insert into bucket table'

STORED AS parquet;

 

准备测试数据

1534862007	1	www.csdn.net	www.baidu.com	192.168.2.103
1534862138	1	www.csdn.net	www.baidu.com	192.168.2.104
1534862139	2	www.csdn.net	www.baidu.com	192.168.2.104
1534862150	2	www.csdn.net	www.baidu.com	192.168.2.104
1534862151	2	www.csdn.net	www.baidu.com	192.168.2.104
1534862205	3	www.csdn.net	www.baidu.com	192.168.2.104
1534862231	3	www.csdn.net	www.baidu.com	192.168.2.104
1534862210	3	www.csdn.net	www.baidu.com	192.168.2.104
1534862208	3	www.csdn.net	www.baidu.com	192.168.2.104
1534862209	4	www.csdn.net	www.baidu.com	192.168.2.104

load数据到page_view_select

load data local inpath '/app/hive/testData/testbucket.txt' overwrite into table page_view_select;

 

使用时需要开启桶表

置强制分桶机制来保证reducer数量和桶的数量一致

set hive.enforce.bucketing=true;

如果没有设置hive.enfoce.bucketing这个参数,那么需要设置和分桶个数相匹配的Reducer数目

set mapred.reduce.tasks=32,并且查询的时候需要添加CLSUTERBY子句。

insert数据到桶表 

insert overwrite table page_view partition(dt='20180821',country ='china')
select viewTime, userid,
page_url, referrer_url,
ip from page_view_select;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值