Hive Bucket Table 的功能和使用方法详解

Bucket

以下这种创建表的方法是不限定 bucket。

create table t1(c1 string,...)

Hive Bucket 表是比分区更细粒度的文件组织方式。以下的方式创建 8 个 bucket。

 create table t1(c1 string) [PARTITIONED BY (C2 STRING)] 
 CLUSTERED BY (C1) [SORTED BY (C1)] INTO 8 BUCKETS;

中括号‘[]’ 表示对应的内容是可选的。
SORTED BY 表示每个 bucket 内部按指定的字段有序。

Bucket 表的影响

insert overwrite

insert overwrite 到 非 bucket 表,可以没有 reduce。但是 insert overwrite 到 bucket 表,除非 from 的表也是 bucket 表,并且 bucket 的数量和 目标表的 bucket 数量有倍数关系,否则需要 reduce,并且 reduce 的数量自动等于 bucket 的数量。

CREATE TABLE test.`store_returns`(
`sr_return_time_sk` bigint, 
`sr_item_sk` bigint, 
`sr_customer_sk` bigint, 
`sr_cdemo_sk` bigint, 
`sr_hdemo_sk` bigint, 
`sr_addr_sk` bigint, 
`sr_store_sk` bigint, 
`sr_reason_sk` bigint, 
`sr_ticket_number` bigint, 
`sr_return_quantity` int, 
`sr_return_amt` decimal(7,2), 
`sr_return_tax` decimal(7,2), 
`sr_return_amt_inc_tax` decimal(7,2), 
`sr_fee` decimal(7,2), 
`sr_return_ship_cost` decimal(7,2), 
`sr_refunded_cash` decimal(7,2), 
`sr_reversed_charge` decimal(7,2), 
`sr_store_credit` decimal(7,2), 
`sr_net_loss` decimal(7,2),
`sr_returned_date_sk` bigint) 
CLUSTERED BY(sr_return_time_sk) INTO 256 BUCKETS;

以下语句任务的会有 256 个 reduce。

insert overwrite table test.store_returns select * from tpcds_hdfs_orc_300.store_returns;
CREATE TABLE test.`store_returns2`(
`sr_return_time_sk` bigint, 
`sr_item_sk` bigint, 
`sr_customer_sk` bigint, 
`sr_cdemo_sk` bigint, 
`sr_hdemo_sk` bigint, 
`sr_addr_sk` bigint, 
`sr_store_sk` bigint, 
`sr_reason_sk` bigint, 
`sr_ticket_number` bigint, 
`sr_return_quantity` int, 
`sr_return_amt` decimal(7,2), 
`sr_return_tax` decimal(7,2), 
`sr_return_amt_inc_tax` decimal(7,2), 
`sr_fee` decimal(7,2), 
`sr_return_ship_cost` decimal(7,2), 
`sr_refunded_cash` decimal(7,2), 
`sr_reversed_charge` decimal(7,2), 
`sr_store_credit` decimal(7,2), 
`sr_net_loss` decimal(7,2),
`sr_returned_date_sk` bigint) 
CLUSTERED BY(sr_return_time_sk) INTO 256 BUCKETS;

以下任务没有 reduce,只有 256 个 map 任务,因为 from 表和 to 表的 bucket 数量相等。

insert overwrite table test.store_returns2 select * from tpcds_hdfs_orc_300.store_returns;

select

=

对于按CLUSTERED BY 字段用= 判断的查询,可以只读取相应的 bucket的数据,加快程序的执行速度。
如以下语句仅用1个 map 读取其中一个 bucket 的数据。

select count(*) from test.store_returns
 where store_returns.sr_return_time_sk = 33777;

非等于

由于数据分到哪个 bucket 是按 hash 算法,所以以下语句需要读取所有的 bucket。

select count(*) from test.store_returns
 where store_returns.sr_return_time_sk > 33777;

Hive 3.1.0 的 bug

Hive 3.1.0 对于不等于,没有生成任何 map,是一个 bug。

select count(*) from test.store_returns
 where store_returns.sr_return_time_sk <> 33777;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值