Hive-分桶

1. 源表建立

Create external table 源表(
字段 类型,
字段 类型,
id int comment '分桶字段'
)row format delimited 
Fields terminated by ','
Location '上传的表存放的路径';

2. 创建分桶表

Create external table 分桶表(
字段 类型,
字段 类型,
id int comment '分桶字段'
)
clustered by (分桶列名id) sorted by (列1 , 列2) into n(桶数) buckets
row format delimited 
Fields terminated by ','
Location '上传的表存放的路径';

加载源数据:

load data local inpath 'linux文件地址' into table 源表;

load data inpath 'HDFS文件地址' into table 源表;

加载分桶数据 :

insert  into 分桶表名 select ... from 源表 where 条件;

3. 分桶表的多表关联

select * from bucket_1 b1 join bucket_2 b2 on b1.分桶字段=b2.分桶字段

两张分桶表关联,其各自分桶的列必须是可作连接条件的列;

分桶的个数之间相除为整数:N1/N2=整数;

4. 分桶分区表

4.1 创建分桶分区源表

Create external table 源表(
字段 类型,
字段 类型,
列1 int comment '分桶字段1',
列2 int comment '分桶字段2',
dt date comment '分区字段'
)row format delimited 
Fields terminated by ','
Location '上传的表存放的路径';

4.2 创建分桶分区表

Create external table 源表(
字段 类型,
字段 类型,
列1 int comment '分桶字段1',
列2 int comment '分桶字段2'
)
partition by (dt date)
clustered by (分桶列名id) sorted by (列1 , 列2) into n(桶数) buckets
row format delimited 
Fields terminated by ','
Location '上传的表存放的路径';

4.3 加载数据

insert into 分桶分区表 partition (dt分区字段)
select  分桶分区表所需字段(...列1,列2)+分区字段(dt)  
from  源表;

5. 分桶抽样

5.1 普通表

select  *  from 普通表 tablesample(bucket 3 out of 6 on id)

要第3桶的桶数据,桶号值分别为桶0、1、2、3、4....因此第3桶的桶号为2

获取的抽样数据为:id % 6 = 2   的id值所在行

5.2 分桶表

select * from 分桶表  tablesample(bucket 3 out of 6 on id) 

假设分桶表共有24个桶,此时6要为24的因数

要第3桶的桶数据,桶号值分别为桶0、1、2、3、4....因此第3桶的桶号为2

24/6=4 表示要在24个桶中抽取4个桶的数据

抽取的四个桶的桶号分别为 (24个桶的桶号) % 6 = 2 

例如:0 % 6=0   1%6=1  2%6=2  3%6=3  4%6=4  5%6=5  6%6=0  7%6=1  8%6=2 ......

因此抽取的桶的序号为2、8、14、20

因为桶的序号从0开始算起的,因此拿取的桶为第3、9、15、21的桶里面的数据

分桶表抽取数据要比普通表抽取数据更快,因为普通表是匹配每一行的id,分桶表只需要匹配桶号即可拿出数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值