參考地址:Hive:ORC File Format存儲格式詳解ios
在Hive中,咱們應該都聽過RCFile這種格式吧,關於這種文件格式的結構什麼的我就不介紹了,感興趣的能夠去網上找找。今天這篇文章要說的主題是ORC File。sql
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的,因此它支持添加和刪除一些列。ide
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文件結構:post
ORC File Format性能
優化
從上圖咱們能夠看出,每一個Stripe都包含index data、row data以及stripe footer。Stripe footer包含流位置的目錄;Row data在表掃描的時候會用到。
Index data包含每列的最大和最小值以及每列所在的行。行索引裏面提供了偏移量,它能夠跳到正確的壓縮塊位置。具備相對頻繁的行索引,使得在stripe中快速讀取的過程當中能夠跳過不少行,儘管這個stripe的大小很大。在默認狀況下,最大能夠跳過10000行。擁有經過過濾謂詞而跳過大量的行的能力,你能夠在表的 secondary keys 進行排序,從而能夠大幅減小執行時間。好比你的表的主分區是交易日期,那麼你能夠對次分區(state、zip code以及last name)進行排序。this
在建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字段裏面出現,他們是:spa
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。具體什麼序列化我就不涉及了。。想深刻了解的能夠看看下面的英文:
Integer Column Serialization
Integer columns are serialized in two streams.
一、present bit stream: is the value non-null?
二、data stream: a stream of integers
Integer data is serialized in a way that takes advantage of the common distribution of numbers:
一、Integers are encoded using a variable-width encoding that has fewer bytes for small integers.
二、Repeated values are run-length encoded.
三、Values that differ by a constant in the range (-128 to 127) are run-length encoded.
The variable-width encoding is based on Google's protocol buffers and uses the high bit to represent whether this byte is not the last and the lower 7 bits to encode data. To encode negative numbers, a zigzag encoding is used where 0, -1, 1, -2, and 2 map into 0, 1, 2, 3, 4, and 5 respectively.
Each set of numbers is encoded this way:
一、If the first byte (b0) is negative:
-b0 variable-length integers follow.
二、If the first byte (b0) is positive:
it represents b0 + 3 repeated integers
the second byte (-128 to +127) is added between each repetition
1 variable-length integer.
In run-length encoding, the first byte specifies run length and whether the values are literals or duplicates. Duplicates can step by -128 to +128. Run-length encoding uses protobuf style variable-length integers.
String Column Serialization
Serialization of string columns uses a dictionary to form unique column values The dictionary is sorted to speed up predicate filtering and improve compression ratios.
String columns are serialized in four streams.
一、present bit stream: is the value non-null?
二、dictionary data: the bytes for the strings
三、dictionary length: the length of each entry
四、row data: the row values
Both the dictionary length and the row values are run length encoded streams of integers.
本博客文章除特別聲明,所有都是原創!
尊重原創,轉載請註明: 轉載自過往記憶(http://www.iteblog.com/)
本文連接: 【Hive:ORC File Format存儲格式詳解】(http://www.iteblog.com/archives/1014)