3 回答

TA貢獻1805條經(jīng)驗 獲得超9個贊
分區(qū)數(shù)據(jù)通常用于水平分布負載,這具有性能優(yōu)勢,并有助于以邏輯方式組織數(shù)據(jù)。示例:如果我們處理的是一個大employee
表,并且經(jīng)常使用帶有WHERE
將結(jié)果限制到特定國家或地區(qū)的子句運行查詢。為了獲得更快的查詢響應(yīng),Hive表可以是PARTITIONED BY (country STRING, DEPT STRING)
。分區(qū)表更改了Hive構(gòu)造數(shù)據(jù)存儲的方式,Hive現(xiàn)在將創(chuàng)建反映分區(qū)結(jié)構(gòu)的子目錄,例如
... /員工/ 國家 / 地區(qū)= ABC / DEPT = XYZ。
如果查詢來自雇員的限制country=ABC
,它將僅掃描一個目錄的內(nèi)容country=ABC
。僅當分區(qū)方案反映通用篩選時,這才能大大提高查詢性能。分區(qū)功能在Hive中非常有用,但是,創(chuàng)建過多分區(qū)的設(shè)計可能會優(yōu)化某些查詢,但會對其他重要查詢不利。另一個缺點是,分區(qū)過多是不必要地創(chuàng)建了大量的Hadoop文件和目錄,并給NameNode帶來了開銷,因為它必須將文件系統(tǒng)的所有元數(shù)據(jù)都保留在內(nèi)存中。
存儲桶是用于將數(shù)據(jù)集分解為更易于管理的部分的另一種技術(shù)。例如,假設(shè)一個表date
用作頂級分區(qū)和employee_id
第二級分區(qū)會導(dǎo)致太多的小分區(qū)。相反,如果我們對employee表進行存儲并employee_id
用作存儲列,則該列的值將由用戶定義的數(shù)字散列到存儲桶中。具有相同記錄的記錄employee_id
將始終存儲在同一存儲桶中。假設(shè)的數(shù)量employee_id
遠大于存儲桶的數(shù)量,則每個存儲桶將具有許多employee_id
。創(chuàng)建表時,您可以指定如下CLUSTERED BY (employee_id) INTO XX BUCKETS;
其中XX是存儲桶數(shù)。桶裝有幾個優(yōu)點。桶的數(shù)量是固定的,因此它不會隨數(shù)據(jù)波動。如果兩個表由進行存儲employee_id
,則Hive可以創(chuàng)建邏輯上正確的采樣。桶也有助于進行有效的地圖側(cè)聯(lián)接等。
- 3 回答
- 0 關(guān)注
- 1263 瀏覽
添加回答
舉報