一、定義
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,行數據:行值
兩個字典長度和行值運行整數長度編碼流。