分區(qū)
分區(qū)列其實(shí)在表中并不存在蜂科,每個(gè)分區(qū)鍵為表的存儲(chǔ)添加了一個(gè)目錄曼追,但是查詢會(huì)返回這一列窍仰,即使數(shù)據(jù)文件中沒有存儲(chǔ)這個(gè)數(shù)據(jù),相當(dāng)于返回了目錄名稱礼殊。
切忌對表過度分區(qū)驹吮,這樣會(huì)導(dǎo)致每個(gè)文件很小,從而導(dǎo)致hadoop存放較慢晶伦,而且分區(qū)會(huì)增加數(shù)據(jù)加載跟數(shù)據(jù)檢索的開銷碟狞。
分區(qū)表加字段必須使用casecade
參數(shù)
開啟支持動(dòng)態(tài)分區(qū)
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
默認(rèn):strict(至少有一個(gè)分區(qū)列是靜態(tài)分區(qū))
set hive.exec.max.dynamic.partitions:動(dòng)態(tài)分區(qū)的上限,默認(rèn)1000婚陪;
set hive.exec.max.dynamic.partitions.pernode 每個(gè)mapper/reducer節(jié)點(diǎn)可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)數(shù)族沃,默認(rèn)100;
分桶
適合于非常小的分區(qū)近忙,分桶讓你可以為每個(gè)表的分桶列定義桶的最大數(shù)據(jù)竭业,每一個(gè)桶就是一個(gè)文件智润,分桶基于散列算法分割及舍,提升join性能,只關(guān)聯(lián)相同的桶窟绷。分桶不會(huì)為當(dāng)前表建立一個(gè)虛擬列锯玛。
clustered by (列) into n buckets 將列的值用于散列函數(shù)分發(fā)到n個(gè)桶中去,如果分桶的列的值是非傾斜的,那么數(shù)據(jù)會(huì)均衡分布攘残。
參數(shù):
set ?hive.enforce.bucketing = true;?開啟支持分桶拙友,自動(dòng)按照分桶表的bucket 進(jìn)行分桶,運(yùn)行時(shí)會(huì)根據(jù)bucket的個(gè)數(shù)自動(dòng)分配reduce task個(gè)數(shù)
抽樣語法
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
TABLESAMPLE語法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示從哪個(gè)bucket開始抽取數(shù)據(jù)
y:必須為該表總bucket數(shù)的倍數(shù)或因子? (Y表示相隔多少個(gè)桶再次抽燃吖)
參考:https://www.cnblogs.com/cac2020/p/10383825.html
更多參數(shù)參考?https://www.cnblogs.com/skyl/p/4780340.html