Hive分桶

Hive 专栏收录该内容
14 篇文章 0 订阅

一、分桶

分桶是用来操作文件的,将一个目录下的文件,划分为多个目录,粒度更细了。

1.分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储(join的时候能有效的避免全表扫描)。
2.对于hive中每一个表、分区都可以进一步进行分桶。
3.由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。

适用场景:数据抽样sampling、map-join

二、开启分桶支持

set hive.enforce.bucketing=true;

1.默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)

2.注意:一次作业产生的桶(文件数量)和reduce task个数一致。

往分桶表中加载数据:

insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;

三、桶表 抽样查询

select * from bucket_table tablesample(bucket 1 out of 4 on columns);

TABLESAMPLE语法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示从哪个bucket开始抽取数据
y:必须为该表总bucket数的倍数或因子

比如说:当表总bucket数为32时 TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些数据?
从第3个桶开始,bucket=32/8=4(个桶);so,我要随机抽样取的桶为 3 , 11 , 19 ,27
如果, x = 2, y = 256 ,从2开始取,取1/8份数据。(这种一般没人用)

四、分桶案例

首先创建一个普通表:

CREATE TABLE psn7( id INT, name STRING, age INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

测试数据如下:

1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88

写入数据:

hive> load data local inpath '/root/data4' into table psn7;

创建分桶表:

CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

将普通表数据加载到分桶表:

insert into table psnbucket select id, name, age from psn7;

抽样:

select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);

结果:
从第二个桶开始,取4/4=1个桶
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值