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檔案結構:
三、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,行資料:行值
兩個字典長度和行值執行整數長度編碼流。