Hive系列:分桶表

2019-08-14 15:49:49 浏览数 (1)

1

什么是分桶表

分桶表,是相对分区表来说,进行更细粒度的划分。

分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照 name 属性分为3个桶,就是对 name 属性值的hash值对3取模,按照取模结果对数据分桶。

取模结果为 0 的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为 2 的数据存放到一个文件。

在物理结构上,一个桶对应着一个文件。

而分区表,只是一个目录,目录下有多少东西都是随意的。

在大表join大表的时候,只需要把相同分区的数据join到一起就好,不用整个表join了。

2

如何建立一个分桶表

代码语言:javascript复制
create table if not exists dw.bl_log_buck3 (
url string,url_alias string,access_start string,access_start_ymdhms string,access_cost string,tracker_global_id string,tracker_session_id string ,user_id string
)
comment '日志明细表'
clustered by (user_id) sorted by (user_id asc) into 32 BUCKETS
row format delimited
    fields terminated by '01'
    collection items terminated by '02'
    map keys terminated by '03'
    lines terminated by 'n'
stored as orc ;

注意一:分桶之前要执行命令hive.enforce.bucketiong=true;

注意二:要使用关键字 clustered by 指定分区依据的列名,还要指定分为多少桶,这里指定分为 32 桶。

3

如何往桶表插入数据呢

代码语言:javascript复制
set hive.enforce.bucketing = true;   
insert  overwrite table dw.bl_log_buck3
 select url,url_alias,access_start,access_start_ymdhms,access_cost,tracker_global_id,tracker_session_id,user_id 
 from dw.bl_log_test3;

必须使用这种跑 MapReduce 的方式才可以顺利的把文件分桶。

使用 load data inpath 这种方式加载数据,即使设置了强制分桶,也是不行的。

0 人点赞