Hive 之內/外表 與 分割槽表/桶表區別
內表:刪表刪資料 (hdfs上的檔案資料)
外表:刪表不刪資料(hdfs上的檔案資料)
內表
建立表時沒加external,預設是內表所有的 Table 資料(不包括 External Table)都儲存在warehouse這個目錄中。
刪除表時,元資料與資料都會被刪除
建立過程和資料載入過程(這兩個過程可以在同一個語句中完成),在載入資料的過程中,實際資料會被移動到資料倉庫目錄中;之後對資料對訪問將會直接在資料倉庫目錄中完成。刪除表時,表中的資料和元資料將會被同時刪除
外表
包含External 的表叫外部表刪除外部表只刪除metastore的元資料,不刪除hdfs中的表資料
外部表 只有一個過程,載入資料和建立表同時完成,並不會移動到資料倉庫目錄中,只是與外部資料建立一個連結。當刪除一個 外部表 時,僅刪除該連結
指向已經在 HDFS 中存在的資料,可以建立 Partition
它和 內部表 在元資料的組織上是相同的,而實際資料的儲存則有較大的差異
分割槽表
加入分割槽避免Hive Select查詢中掃描整個表內容,會消耗很多時間做沒必要的工作。(例如每一天的日誌存放在一個分割槽中,這樣根據特定的日期查詢)一個表可以擁有一個或者多個分割槽,每個分割槽以資料夾的形式單獨存在表文件夾的目錄下。
桶表
對於每一個表(table)或者分割槽, Hive可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。Hive也是 針對某一列進行桶的組織。Hive採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。桶是以檔案的形式存放在表或者分割槽的目錄下。
把表(或者分割槽)組織成桶(Bucket)有兩個理由:
(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,Hive 在處理有些查詢時能利用這個結構。具體而言,連線兩個在(包含連線列的)相同列上劃分了桶的表,可以使用 Map 端連線 (Map-side join)高效的實現。比如JOIN操作。對於JOIN操作兩個表有一個相同的列,如果對這兩個表都進行了桶操作。那麼將儲存相同列值的桶進行JOIN操作就可以,可以大大較少JOIN的資料量。
(2)使取樣(sampling)更高效。在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便。