[特性]Hive桶功能使用 2015-11-14 22:30

说明

通过桶,将指定的列的值进行哈希,并映射到不同的文件中。比如id列的哈希值为0的记录保存到文件0中,id列哈希值为1的记录保存到文件1中。通过此方式,可以在做表进行抽样时,只读取某一个文件中的记录即可。而不需要读取全表的多个文件,从而提高效率。比如:将表划分成4个桶。那么对表进行1/4抽样时,仅需要读取其中的一个数据文件,而不需要读取4个数据文件。大大提升效率。

另外一种场景下也可以用到桶:对多表进行关联查询时,如果使用了桶。那么两个表的关联列进行桶映射后,方便进行merge-sort。从而提高效率。

使用桶

准备

创建带桶的内部表:

1
2
3
CREATE TABLE student5(id INT, name STRING) 
CLUSTERED BY (id) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

设置插入数据时,按表声明的桶创建相应的桶,并插入数据(这一步容易遗漏):

set hive.enforce.bucketing=true;

插入数据:

INSERT OVERWRITE TABLE student5 SELECT id,name FROM student6;

查看是否按声明的桶数据,生成相应数量的数据文件:

hdfs dfs -ls -R /user/hive/warehouse/student5/

验证

从表中抽样1/4的数据出来:

1
SELECT * FROM student5 TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);

check是否抽样出来的数量来自同一个数据文件中:

hdfs dfs -text /user/hive/warehouse/student5/000003_0

正常情况下:抽样出来的数量来自同一个数据文件中。

Tags: #Hive    Post on Hadoop