使用示例:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
STORED AS SEQUENCEFILE;
为什么要分桶:
分桶是比分区更细粒度的数据存储,可以对表或者分区进行分桶
对分桶字段做哈希对桶数取余来获取对应的桶号,划分N个桶,就会在HDFS产生N个对应的存储文件
分桶的两个优点:
1、便于采样
table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
若不是桶表,只是一张普通的表,则查询时候需要全表扫描,先分桶,再抽样
2、mapside join
join时如果两张表的分桶字段做join,就可以按相同的桶号进行join,这样就可以对对应的桶进行join,避免做全表的笛卡尔积,效率会比较高
当桶内的数据量小于25M可以将表内数据加载到内存中,在map端进行join,避免reduce join,是一种优化手段
参考:
1、https://zhuanlan.zhihu.com/p/66599255
2、https://cwiki.apache.org/confluence/display/Hive/LanguageManual