Hive 分桶
- 分桶
- 對于每一個(gè)表或者分區(qū)擎场,Hive可以進(jìn)一步組織成桶,也就是更為細(xì)粒度的數(shù)據(jù)范圍劃分
- Hive是針對某一列進(jìn)行分桶
- Hive采用對列值哈希,然后除以桶的個(gè)數(shù)求余的方式?jīng)Q定該條記錄存放在哪個(gè)桶當(dāng)中
- 好處
- 獲得更高的查詢處理效率
- 使取樣(sampling) 更高效
- 分桶的使用
- select * from bucketed_user
- tablesample(bucket 1 out of 2 on id)
- bucket join
- set hive.optimize.bucketmapjoin = true;
- set hive.optimize.bucketmapjoin.sortedmerge= true;
- set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
- 樣例:
- create table bucketed_user(
- id int,
- name string
- )
- clustered by (id) sorted by (name) into 4 buckets
- row format delimited fields terminated by '\t' stored as textfile;
- 分桶默認(rèn)不開啟 需開啟
- Set hive.enforce.bucketing= true;
- 鏈接兩個(gè)在(包含連接列)相同列上劃分了桶的表,可以使用Map端鏈接(Map-side join)高效的實(shí)現(xiàn)耸成。比如Join操作。對于Join操作兩個(gè)表有一個(gè)相同的列浴鸿,如果對著兩個(gè)表都進(jìn)行了桶操作井氢。那么將保持相同列值得桶進(jìn)行Join操作就可以,可以大大減少Join的數(shù)據(jù)量岳链。
- 對于map端連接的情況花竞,兩個(gè)表以相同方式劃分桶。處理左邊表內(nèi)某個(gè)桶的mapper知道右邊的表內(nèi)相匹配的行在對應(yīng)的桶內(nèi)掸哑。因此约急,mapper只需要獲取那個(gè)桶(這只是右邊表內(nèi)存儲(chǔ)數(shù)據(jù)的一小部分)即可進(jìn)行連接。這一優(yōu)化方法并不一定要求 兩個(gè)表必須桶的個(gè)數(shù)相同举户,兩個(gè)表的桶個(gè)數(shù)是倍數(shù)關(guān)系也可以烤宙。