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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章