hive --桶

【
 		精解:
 			建立桶表時,指定桶的個數,分桶的依據字段,hive就能夠自動將數據分桶存儲。查詢時只須要遍歷一個桶裏的數據,或者遍歷部分桶,這樣就提升了查詢效率。
 	】
 	對於每個表(table)或者分區,hive 能夠進一步組織成桶,也就是說桶是更爲細粒度的數據範圍劃分。hive也是針對某一列進行桶的組織。
 	hive採用對列hash,而後除以桶的個數求餘的方式決定該條記錄存放在哪一個桶當中。

 	`set hive.enforce.bucketing = true;`

 	把表(或者分區)組織成桶(Bucket)有兩個理由:
 		一、得到更高的查詢處理效率。桶爲表加上了額外的結構,hive在處理有些查詢時能利用這個結構。具體而言,鏈接兩個在(包含鏈接列的)
 		相同列劃分了桶的表,可使用map端鏈接(map-side join)高效的實現。好比join操做。對於join操做兩個表有一個相同的列,若是對這
 		兩個表都進行桶操做。那麼將保存相同列值得桶進行join操做就能夠,能夠大大減小join的數據。
 		二、使用樣(sampling)更高效。在處理大規模數據集時,在開發和修改查詢的階段,若是能在數據集的一小部分數據上試運行查詢,會帶來不少方便。

 	一、建立帶分區帶桶的table:
 		create table bucketed_user
 		(
 			id int,
 			name string
 		) 
 		partitioned by (stat_date string)
 		clustered by (id) sorted by (name) into 4 buckets 
 		row format delimited fields terminated by '\t' [stored as textfile];

 		-clustered by 是指根據id的值進行hash後取模分桶個數,根據獲得的結果,肯定這行數據分入哪一個桶中,這樣的分法,能夠確保相同id的數據放入同一個桶中。
 					  而經銷商的線索數據,大部分是根據id進行查詢的。這樣大部分狀況下是隻須要查詢一個桶中的數據就能夠了。
 		-sorted by 是指定桶中的數據以哪一個字段進行排序,排序的好處是,在join操做時能得到很高的效率。
 		-into 4 buckets 是指定一共分多少個桶。
 		-在hdfs上存儲時,一個桶存入一個文件中,這樣根據id進行查詢時,能夠快速肯定數據存在於哪一個桶中,而只遍歷一個桶能夠提供查詢效率。

 		--插入數據
 			>from bucketed_user_tmp
 			>insert overwrite table bucketed_user partition(stat_date="20171208")
 			>select id,name where stat_date="20171207" sort by id;

 		--取樣查看
 			>select * from bucketed_user tablesample(bucket 2 out of 2 on id);

 		首先,咱們來看如何告訴hive一個表應該被劃分紅桶。咱們使用clustered by子句來指定劃分桶所用的列和要劃分的桶的個數:
 		create table bucketed_user 
 		(
 			id int,
 			name string
 		)
 		clustered by (id) into 4 buckets;

 		在這裏,咱們使用用戶ID來肯定如何劃分桶
相關文章
相關標籤/搜索