1
什么是分桶表
分桶表,是相对分区表来说,进行更细粒度的划分。
分桶将整个数据内容按照某列属性值的hash值进行区分,如要按照 name 属性分为3个桶,就是对 name 属性值的hash值对3取模,按照取模结果对数据分桶。
取模结果为 0 的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为 2 的数据存放到一个文件。
在物理结构上,一个桶对应着一个文件。
而分区表,只是一个目录,目录下有多少东西都是随意的。
在大表join大表的时候,只需要把相同分区的数据join到一起就好,不用整个表join了。
2
如何建立一个分桶表
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 '\001'
collection items terminated by '\002'
map keys terminated by '\003'
lines terminated by '\n'
stored as orc ;
注意一:分桶之前要执行命令hive.enforce.bucketiong=true;
注意二:要使用关键字 clustered by 指定分区依据的列名,还要指定分为多少桶,这里指定分为 32 桶。
3
如何往桶表插入数据呢
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 这种方式加载数据,即使设置了强制分桶,也是不行的。