1. 程式人生 > >Hive:ORC與RC儲存格式之間的區別

Hive:ORC與RC儲存格式之間的區別

一、定義

  ORC File,它的全名是Optimized Row Columnar (ORC) file,其實就是對RCFile做了一些優化。據官方文件介紹,這種檔案格式可以提供一種高效的方法來儲存Hive資料。它的設計目標是來克服Hive其他格式的缺陷。運用ORC File可以提高Hive的讀、寫以及處理資料的效能。
和RCFile格式相比,ORC File格式有以下優點:
  (1)、每個task只輸出單個檔案,這樣可以減少NameNode的負載;
  (2)、支援各種複雜的資料型別,比如: datetime, decimal, 以及一些複雜型別(struct, list, map, and union);
  (3)、在檔案中儲存了一些輕量級的索引資料;
  (4)、基於資料型別的塊模式壓縮:a、integer型別的列用行程長度編碼(run-length encoding);b、String型別的列用字典編碼(dictionary encoding);
  (5)、用多個互相獨立的RecordReaders並行讀相同的檔案;
  (6)、無需掃描markers就可以分割檔案;
  (7)、繫結讀寫所需要的記憶體;
  (8)、metadata的儲存是用 Protocol Buffers的,所以它支援新增和刪除一些列。

二、ORC File檔案結構

  ORC File包含一組組的行資料,稱為stripes,除此之外,ORC File的file footer還包含一些額外的輔助資訊。在ORC File檔案的最後,有一個被稱為postscript的區,它主要是用來儲存壓縮引數及壓縮頁尾的大小。
在預設情況下,一個stripe的大小為250MB。大尺寸的stripes使得從HDFS讀資料更高效。

  在file footer裡面包含了該ORC File檔案中stripes的資訊,每個stripe中有多少行,以及每列的資料型別。當然,它裡面還包含了列級別的一些聚合的結果,比如:count, min, max, and sum。下圖顯示出可ORC File檔案結構:

ORC File Format

三、Stripe結構

  從上圖我們可以看出,每個Stripe都包含index data、row data以及stripe footer。Stripe footer包含流位置的目錄;Row data在表掃描的時候會用到。
  Index data包含每列的最大和最小值以及每列所在的行。行索引裡面提供了偏移量,它可以跳到正確的壓縮塊位置。具有相對頻繁的行索引,使得在stripe中快速讀取的過程中可以跳過很多行,儘管這個stripe的大小很大。在預設情況下,最大可以跳過10000行。擁有通過過濾謂詞而跳過大量的行的能力,你可以在表的 secondary keys 進行排序,從而可以大幅減少執行時間。比如你的表的主分割槽是交易日期,那麼你可以對次分割槽(state、zip code以及last name)進行排序。

四、Hive裡面如何用ORCFile

  在建Hive表的時候我們就應該指定檔案的儲存格式。所以你可以在Hive QL語句裡面指定用ORCFile這種檔案格式,如下:

CREATE TABLE ... STORED AS ORC
 
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
 
SET hive.default.fileformat=Orc

所有關於ORCFile的引數都是在Hive QL語句的TBLPROPERTIES欄位裡面出現,他們是:

Key Default Notes
orc.compress ZLIB high level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size 262,144 number of bytes in each compression chunk
orc.stripe.size 268435456 number of bytes in each stripe
orc.row.index.stride 10,000 number of rows between index entries (must be >= 1000)
orc.create.index true whether to create row indexes

下面的例子是建立一個沒有啟用壓縮的ORCFile的表

create table Addresses (
  name string,
  street string,
  city string,
  state string,
  zip int
) stored as orc tblproperties ("orc.compress"="NONE");
五、序列化和壓縮

  對ORCFile檔案中的列進行壓縮是基於這列的資料型別是integer或者string。

整數列序列化

整數列序列化有兩個工作流。
1,目前位元流:是值非空?
2,資料流:整數流
整型資料的序列在需要數字的共同配送的優勢的方式:
1,整數是使用可變寬度編碼具有用於小整數更少位元組編碼。
2,重複值是執行長度編碼。
3,如果該值通過一個恆定的範圍內(-128-127)的不同是執行長度編碼。
可變寬度編碼是基於谷歌的協議緩衝區,並使用高位元來表示這個位元組是否是不是最後的和低7位對資料進行編碼。編碼負數,Z字​​形編碼被使用,如圖2所示,分別其中0 -1 1 -2和2對映成0 1 3 4和5。


每一組數字編碼是這樣的:
1,如果第一個位元組(B0)為負:
-B0可變長度整數跟進。
2,如果第一個位元組(B0)是正的:
它代表B0 + 3的整數反覆
第二個位元組(-128到+127)在每次重複之間增加
1可變長度整數。


在執行長度編碼,第一個位元組指定執行長度和值是否文字或複製。重複可以通過-128到+128。執行長度編碼使用protobuf的風格變長整數。


字串列序列化
字串列的序列化使用的字典,形成有序且唯一列值的字典,可以加快過濾速度,提高壓縮比。

字串列序列化有兩個工作流。
1,目前位元流:是值非空?
2,資料字典:對於字串中的位元組
3,字典長度:每個條目的長度
4,行資料:行值
兩個字典長度和行值執行整數長度編碼流。