Hive:ORC File Format存儲格式詳解

參考地址:Hive:ORC File Format存儲格式詳解ios


  在Hive中,咱們應該都聽過RCFile這種格式吧,關於這種文件格式的結構什麼的我就不介紹了,感興趣的能夠去網上找找。今天這篇文章要說的主題是ORC File。sql

1、定義

  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

2、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文件結構:post

ORC File Format性能

優化

3、Stripe結構

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

4、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字段裏面出現,他們是: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");
5、序列化和壓縮

  對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)

相關文章
相關標籤/搜索