【Hive筆記】8.2——文件存儲格式

前言

在hive中支持的存儲數數據格式主要有:TEXTFILE,SEQUENCEFILE,ORC,PARQUET。

列式存儲和行式存儲

在當今的數據處理大致可分爲兩大類,聯機事務處理OLTP(on-line-transaction processing)和聯機分析處理OLAP(on-line Analytical processing)

OLTP是傳統關係型數據庫的主要 應用,用來執行 一些基本的日常的事務處理,比如:數據庫的增刪改查等。而OLAP則是分佈式數據庫的主要應用它對實時性 要求不高,但是處理量 巨大。

在這裏插入圖片描述

  1. 行存儲的特點
    查詢滿足條件的一整行數據的時候,列存儲則需要去每個聚集的字段找到對應的每個列的值,行存儲只需要找到其中一個值,其餘的值都在相鄰地方,所以此時行存儲查詢的速度更快
  2. 列存儲的特點
    因爲每個字段的數據聚集存儲,在查詢只需要少數幾個字段的時候,能大大減少讀取的數據量;每個字段的數據類型一定是相同的,列式存儲可以針對性的設計更好的設計壓縮算法。

TEXTFILE和SEQUENCEFILE的存儲格式都是基於行存儲的;
OPC和PARQUET是基於列式存儲的。

TextFile格式

默認格式,數據不做壓縮,磁盤開銷大,數據解析開銷大。可結合Gzip,Bzip2使用,但使用Gzip這種方法,hive不會對數據進行切分,從而無法對數據進行並行操作。

Ocr格式

Ocr(Optimized Row columnar)是Hive0.11版引入的新的存儲格式。

每個Orc文件由1個或多個stripe組成,每個stripe250MB大小,這個Stripe實際相當於RowGroup概念,不過大小由4MB-》250MB,這樣應該能提升順序讀的吞吐率。每個Stripe裏有三部分組成,分別爲Index Data,Row Data,Stripe Footer;
在這裏插入圖片描述

  1. Index Data : 一個輕量級的index,默認是每隔1W行做一個索引。這樣做的索引應該只是記錄某行的各字段在Row Data中的offset。
  2. Row Data : 存的是具體數據,先取部分行,然後對這些行按列進行存儲。對每個列進行編碼,分成多個Stream來存儲。
  3. Stripe Footer:存的是各個Stream的類型,長度等信息。

每個文件有一個File Footer,這裏存的是每個Stripe的行數,每個Column的數據類型信息等;每個文件的尾部是一個PostScript,這裏面記錄了整個文件的壓縮類型以及FileFooter的長度信息等。在讀取文件時,會seek到文件尾部讀PostScript,從裏面解析到File Footer的長度,在讀File Footer從裏面解析到各個Strpe信息,在讀各個Stripe,即從後往前讀。

其實該方式是行列結合的方式。不是完全是行存儲

Parquet格式

Parquet是面向分析型業務的列式存儲格式,由Twitter和cloudera合作開發。

Parquet文件是以二進制方式進行存儲的,所以是不可以直接讀取的,文件中包括該文件的數據和元數據,因此Parquet格式文件是自解析的。

通常情況下,在存儲Parquet數據的時候會按照Block大小設置行組的大小,由於一般情況下每一個Mapper任務處理數據的最小單位是一個block,這樣可以把每一個行組由一個Mapper任務處理,增大任務執行並行度。Parquet文件的格式如下圖所示:
在這裏插入圖片描述
上圖展示了一個parquet文件的內容,一個文件中可以存儲多個行組,文件的首位都是該文件的Magic Code,用於校驗它是否是一個Parquet文件,Footer length 記錄了文件元數據的大小,通過該值和文件長度可以計算出元數據的偏移量,文件的元數據中包括每一個行組的元數據信息和該文件存儲數據的Schema信息。除了文件中每一行組的元數據,每一頁的開始都會存儲該頁的元數據,在Parquet中,有三種類型的頁:數據頁,字典頁和索引頁。數據頁用於存儲當前行組中該列的值,字典頁存儲該列值的編碼字典,每一個列快中最多包含一個字典頁,索引頁用來存儲當前行組下該列的索引,目前parquet
中還不支持索引頁。

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