1. 程式人生 > >[Hive]-列式存儲篇

[Hive]-列式存儲篇

字節 oop filter 復雜 資料 optimize 塊大小 com 結果

1. ORC是什麽

  ORC,全稱 Optimized Row Columnar.是Hadoop生態圈的列式存儲概念,最早由Hive提出.\

  在Hive的ORC,首先依然是根據行組分割整個表,但是在每個行組中,按列存儲.ORC文件是自描述的,它的元數據使用Protocol Buffers進行序列化,並盡可能的進行壓縮

2.ORC的好處

  列式存儲有很高的壓縮比.(因為同列數據,數據格式,重復率等相同幾率很高,並且可以針對列相同的數據類型,采用更好的壓縮方式)

  優化查詢效率(可以只查詢某些需要的列而不用掃整個數據,降低IO)

  提供了多種索引()row group index、bloom filter index等),並且可以保存列本身的統計信息(Min,Max,Sum等),對部分查詢謂詞效率更高

  可以支持更為復雜的數據結構.比如Map,或者更加不規則的數據結構

3.存儲結構

  Hive.ORC中,數據以二進制文件存儲,所以是不可以直接閱讀的,而元數據是隨同ORC一起的,所以是自解析的.具體如下:

  ORC文件:保存在HDFS的普通二進制文件,每一個ORC文件包含多個stripe,每一個stripe包含多條數據.針對每一個stripe,進行列式存儲.

  ORC文件級元數據:包含整個ORC文件的描述信息,文件Meta和統計信息,所有在此ORC文件的stripe信息和文件的shemale信息,保存在文件的末尾.

  stripe:一組行形成一個stripe,讀寫的最小單位(每次讀寫至少讀取一個stripe),一般為HDFS的一個塊大小,保存了每一列的索引和數據

  stripe元數據:保存stripe的位置,每一個列在本stripe的統計信息以及所有Stream信息

  row group:行組. 索引化的最小單位,一個stripe包含多個row group

  stream:一個stream表示文件中有效的一段.包括索引和數據兩類。索引stream保存每一個row group的位置和統計信息,數據stream包括多種類型的數據,具體需要哪幾種是由該列類型和編碼方式決定

4.索引統計

  ORC文件中包含三個級別的統計信息,ORC,stripe,row group級.用於在某些查詢時指示是否可以跳過某段數據,或直接得出某些統計結果等

    ORC級 ORC文件的末尾記錄,整個文件的列統計信息,

    stripe級 ORC文件還會記錄,每個stripe的列統計信息.

    row group級 ORC文件還會記錄,每個行組的列統計信息.(行組的範圍可以指定,默認10000)

  主要用於查詢的優化.比如謂詞a>4 && a<10時,當查詢到ORC或者stripe或者行組的A列統計最小為11或者最大為3時就不會讀入,將整個跳過該ORC或者stripe或者行組.  

5.數據讀取方式

  ORC文件從末尾開始讀取.文件的最後一個字節存儲的Postscript長度.Postscript長度不會超過256個字節,Postscript存儲的是整個文件的元數據信息.包括文件的壓縮格式,每一個文件塊的最大長度(讀取時的內存分配),Foot長度,以及一些版本信息.

  參考資料 https://www.cnblogs.com/ITtangtang/p/7677912.html

[Hive]-列式存儲篇