1.索引
???Hive支持索引,但是Hive的索引與關(guān)系型數(shù)據(jù)庫中的索引并不相同合陵,比如,Hive不支持主鍵或者外鍵澄阳。
???Hive索引可以建立在表中的某些列上拥知,以提升一些操作的效率,例如減少M(fèi)apReduce任務(wù)中需要讀取的數(shù)據(jù)塊的數(shù)量碎赢。
???為什么要?jiǎng)?chuàng)建索引低剔?Hive的索引目的是提高Hive表指定列的查詢速度。沒有索引時(shí),類似'WHERE tab1.col1 = 10' 的查詢襟齿,Hive會(huì)加載整張表或分區(qū)姻锁,然后處理所有的rows,但是如果在字段col1上面存在索引時(shí)蕊唐,那么只會(huì)加載和處理文件的一部分屋摔。
???與其他傳統(tǒng)數(shù)據(jù)庫一樣,增加索引在提升查詢速度時(shí)替梨,會(huì)消耗額外資源去創(chuàng)建索引表和需要更多的磁盤空間存儲(chǔ)索引。
2.分區(qū)
???為了對表進(jìn)行合理的管理以及提高查詢效率装黑,Hive可以將表組織成“分區(qū)”副瀑。
分區(qū)是表的部分列的集合,可以為頻繁使用的數(shù)據(jù)建立分區(qū)恋谭,這樣查找分區(qū)中的數(shù)據(jù)時(shí)就不需要掃描全表糠睡,這對于提高查找效率很有幫助。
???分區(qū)是一種根據(jù)“分區(qū)列”(partition column)的值對表進(jìn)行粗略劃分的機(jī)制疚颊。Hive中每個(gè)分區(qū)對應(yīng)著表很多的子目錄狈孔,將所有的數(shù)據(jù)按照分區(qū)列放入到不同的子目錄中去。
???為什么要分區(qū)材义?龐大的數(shù)據(jù)集可能需要耗費(fèi)大量的時(shí)間去處理均抽。在許多場景下,可以通過分區(qū)的方法減少每一次掃描總數(shù)據(jù)量其掂,這種做法可以顯著地改善性能油挥。
???數(shù)據(jù)會(huì)依照單個(gè)或多個(gè)列進(jìn)行分區(qū),通常按照時(shí)間款熬、地域或者是商業(yè)維度進(jìn)行分區(qū)深寥。為了達(dá)到性能表現(xiàn)的一致性,對不同列的劃分應(yīng)該讓數(shù)據(jù)盡可能均勻分布贤牛。最好的情況下惋鹅,分區(qū)的劃分條件總是能夠?qū)?yīng)where語句的部分查詢條件。
???Hive的分區(qū)使用HDFS的子目錄功能實(shí)現(xiàn)殉簸。每一個(gè)子目錄包含了分區(qū)對應(yīng)的列名和每一列的值闰集。但是由于HDFS并不支持大量的子目錄,這也給分區(qū)的使用帶來了限制喂链。我們有必要對表中的分區(qū)數(shù)量進(jìn)行預(yù)估返十,從而避免因?yàn)榉謪^(qū)數(shù)量過大帶來一系列問題。
???Hive查詢通常使用分區(qū)的列作為查詢條件椭微。這樣的做法可以指定MapReduce任務(wù)在HDFS中指定的子目錄下完成掃描的工作洞坑。HDFS的文件目錄結(jié)構(gòu)可以像索引一樣高效利用。
3.分桶
???桶是通過對指定列進(jìn)行哈希計(jì)算來實(shí)現(xiàn)的蝇率,通過哈希值將一個(gè)列名下的數(shù)據(jù)切分為一組桶迟杂,并使每個(gè)桶對應(yīng)于該列名下的一個(gè)存儲(chǔ)文件刽沾。
???為什么要分桶?在分區(qū)數(shù)量過于龐大以至于可能導(dǎo)致文件系統(tǒng)崩潰時(shí)排拷,我們就需要使用分桶來解決問題了侧漓。
???分區(qū)中的數(shù)據(jù)可以被進(jìn)一步拆分成桶,不同于分區(qū)對列直接進(jìn)行拆分监氢,桶往往使用列的哈希值對數(shù)據(jù)打散布蔗,并分發(fā)到各個(gè)不同的桶中從而完成數(shù)據(jù)的分桶過程。
???hive使用對分桶所用的值進(jìn)行hash浪腐,并用hash結(jié)果除以桶的個(gè)數(shù)做取余運(yùn)算的方式來分桶纵揍,保證了每個(gè)桶中都有數(shù)據(jù),但每個(gè)桶中的數(shù)據(jù)條數(shù)不一定相等议街。
???哈希函數(shù)的選擇依賴于桶操作所針對的列的數(shù)據(jù)類型泽谨。除了數(shù)據(jù)采樣,桶操作也可以用來實(shí)現(xiàn)高效的Map端連接操作特漩。
???在數(shù)據(jù)量足夠大的情況下吧雹,分桶比分區(qū),更高的查詢效率涂身。
4.總結(jié)
???索引和分區(qū)最大的區(qū)別就是索引不分割數(shù)據(jù)庫雄卷,分區(qū)分割數(shù)據(jù)庫。
???索引其實(shí)就是拿額外的存儲(chǔ)空間換查詢時(shí)間访得,但分區(qū)已經(jīng)將整個(gè)大數(shù)據(jù)庫按照分區(qū)列拆分成多個(gè)小數(shù)據(jù)庫了龙亲。
???分區(qū)和分桶最大的區(qū)別就是分桶隨機(jī)分割數(shù)據(jù)庫,分區(qū)是非隨機(jī)分割數(shù)據(jù)庫悍抑。因?yàn)榉滞笆前凑樟械墓:瘮?shù)進(jìn)行分割的鳄炉,相對比較平均;而分區(qū)是按照列的值來進(jìn)行分割的搜骡,容易造成數(shù)據(jù)傾斜拂盯。
???其次兩者的另一個(gè)區(qū)別就是分桶是對應(yīng)不同的文件(細(xì)粒度),分區(qū)是對應(yīng)不同的文件夾(粗粒度)记靡。
???普通表(外部表谈竿、內(nèi)部表)、分區(qū)表這三個(gè)都是對應(yīng)HDFS上的目錄摸吠,桶表對應(yīng)是目錄里的文件空凸。