学习 Hive(四):桶

桶(Bucket)是优化查询的另一种方式。

不同于分区,桶对应着 HDFS 中的文件片段(segment)。

首先,指定表中的列来确定如何划分桶。

然后,Hive 对值进行哈希并将结果除以桶的个数取余数。

最后,计算结果相同的记录将被分配到同一个桶内(文件片段)。

注意:

  1. 桶的数量,尽量是2的倍数
  2. Reduce 任务的数量尽量等于桶的数量
  3. 由于 Load 并不会使用元数据对数据进行校验,所以不能像其它表一样使用 Load 加载数据,而是要使用 Insert 插入数据

创建分桶表

CREATE TABLE IF NOT EXISTS friends_bucket  
(
  id INT,
  name STRING,
  sex STRING
)
CLUSTERED BY (id) INTO 2 BUCKETS  
DELIMITED FIELDS TERMINATED BY ',';  

配置

set map.reduce.tasks = 2;  
set hive.enforce.bucketing = true;  

转储

INSERT OVERWRITE TABLE friends_bucket  
SELECT * FROM friends_txt;