Hadoop Hive概念學習系列之hive里的分區(九)


 

 

   為了對表進行合理的管理以及提高查詢效率,Hive可以將表組織成“分區”。

  分區是表的部分列的集合,可以為頻繁使用的數據建立分區,這樣查找分區中的數據時就不需要掃描全表,這對於提高查找效率很有幫助。

    分區是一種根據“分區列”(partition column)的值對表進行粗略划分的機制。Hive中的每個分區對應數據庫中相應分區列的一個索引,每個分區對應着表下的一個目錄,在HDFS上的表現形式與表在HDFS上的表現形式相同,都是以子目錄的形式存在。

 

  一個表可以在多個維度上進行分區,並且分區可以嵌套使用。建分區需要在創建表時通過PARTITIONED BY子句指定,例如:

CREATE TABLE logs(
timestamp BIGINT,
line STRING
)
PARTITIONED BY (date STRING,country STRING);

 

 

  在將數據加載到表內之前,需要數據加載人員明確知道所加載的數據屬於哪一個分區。

  使用分區在某些應用場景下能給有效地提高性能,當只需要遍歷某一個小范圍內的數據或者一定條件下的數據時,它可以有效減少掃描數據的數量,前提是需要將數據導入到分區內。

  注意:PARTITONED BY子句中定義的列是表中正式的列(分區列),但是數據文件內並不包含這些列

 

 

 

在Hive里,為什么要分區?

       龐大的數據集可能需要耗費大量的時間去處理。在許多場景下,可以通過分區或切片的方法減少每一次掃描總數據量,這種做法可以顯著地改善性能。

數據會依照單個或多個列進行分區,通常按照時間、地域或者是商業維度進行分區。比如vido表,分區的依據可以是電影的種類和評級,另外,按照拍攝時間划分可能會得到更一致的結果。為了達到性能表現的一致性,對不同列的划分應該讓數據盡可能均勻分布。最好的情況下,分區的划分條件總是能夠對應where語句的部分查詢條件。

  Hive的分區使用HDFS的子目錄功能實現。每一個子目錄包含了分區對應的列名和每一列的值。但是由於HDFS並不支持大量的子目錄,這也給分區的使用帶來了限制。我們有必要對表中的分區數量進行預估,從而避免因為分區數量過大帶來一系列問題。

  Hive查詢通常使用分區的列作為查詢條件。這樣的做法可以指定MapReduce任務在HDFS中指定的子目錄下完成掃描的工作。HDFS的文件目錄結構可以像索引一樣高效利用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM