Hive模式設計

按天劃分的表:使用分區

分區:
一個理想的分區方案不應該導致產生太多的分區和文件夾目錄,並且每個目錄下的文件應該足夠大,應該是文件系統中塊大小的若干倍。
如何保證:
按時間範圍進行分區的一個好的策略就是按照不同的時間粒度來確定合適大小的數據積累量,而且安裝這個時間粒度。
另一個解決方案是使用兩個級別的分區並且使用不同的維度。
最後如果用戶找不到好的分區方案,可以使用"分桶表數據存儲"。

同一份數據的多重處理:提高效率
from history
insert overwrite table sales select * where action="purchased"
insert overwrite table credits select * where action="returned" ;

分桶表數據存儲:
分區提供一個隔離數據和優化查詢的便利方式,但是並不是所有的數據集都可形成合理的分區。
分桶是將數據集分解成更容易管理的若干部分的另一個技術。
create table weblog(
userId int,
url string ,
sourceIp string
)
partitioned by (dt string)
clustered by (userId) into 96 buckets ;

下面介紹如何在insert...table語句時正確的填充表。
首先我們需要設置一個屬性來強制Hive爲目標表的分桶初始化過程設置一個正確的reducer個數。然後我們在執行一個查詢來填充分區。
set hive.enforce.bucketing = true ;
from raw_logs 
insert overwrite table weblog
partition (dt="2009-02-25")
select userId,url,sourceIp where dt="2009-02-25" ;
注:如果我們沒有使用hive.enforce.bucketing屬性,那麼我們就需要自己設置和分桶個數相匹配的reducer的個數。例如,使用set mapred.reduce.task = 96 ,然後在insert語句中,需要再select語句後增加cluster by語句。

分桶好處:
因爲桶的數量是固定的,所以沒有數據波動;
桶很適合抽樣;
分桶有利於執行高效的map-side join。


     
發佈了43 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章