Hive ORC檔案儲存格式(續)

2021-07-14 08:10:35 字數 3430 閱讀 3771

本文在hive-orc檔案儲存格式的理論基礎上,進一步分析乙個實際的hive orc表中的資料儲存形式。

庫名+表名:fileformat.test_orc

字段型別

category_id

string

product_id

intbrand_id

intprice

double

category_id_2

string

在hive中命令desc formatted fileformat.test_orc;的結果如下圖:

根據上圖中的location資訊,檢視在hdfs上的檔案:

hive提供了乙個--orcfiledump引數用於檢視hdfs上orc**的檔案資訊,在hive-0.13版本中的使用方法為:hive --orcfiledump,其他版本的使用方法可以去官方文件中查詢。

下面是命令hive --orcfiledump /user/hive/warehouse/fileformat.db/test_orc/000000_0的查詢結果

接下來的分析,請對照著文章hive-orc檔案儲存格式中的圖1-orc檔案結構圖進行。

使用hql語句,統計出各字段的count, min, max, sum資訊如下:

欄位count

minmax

sumcategory_id

1000000

5011

975673

4.0222868968e11

product_id

1000000

96850997770

27158964508399

brand_id

999130

01026427

774991825568

price

1000000

-0.0092

358000.0

1.8953626711045265e8

category_id_2

1000000

5010

5996

5.183530839e9

記錄整張表的記錄數,壓縮方式,壓縮大小,以及表結構。在表結構部分,orc將整張表的所有字段構造成乙個大的struct結構。對應圖1-orc檔案結構圖中的postscript部分。

統計當前hdfs檔案對應stripe的資訊,包括各個欄位的count,min, max, sum資訊。對於最外層的struct,只統計其count值。由於這張表資料量不大,當前hdfs檔案中只有乙個stripe。對應圖1-orc檔案結構圖中的stripe footer部分。

統計內容和第二部分一致,不過這裡統計的整張表的每個欄位count, min, max, sum資訊。對應圖1-orc檔案結構圖中的filefooter部分。

這裡我們將dump檔案中的統計資訊,與各欄位實際統計資訊作對比。通過與上面**中各欄位統計資訊對比,發現對於int型別和double型別的字段,min, max, sum的結果都是匹配的。但是對於string型別的字段,僅僅只有min, max統計結果一致,sum的結果不相同。

統計各stripe的offset,總記錄行數等stripe層次的資訊。該stripe中各字段的index data和row data,以及每個欄位的編碼方式。

前面一行stripe: offset: 3 data: 7847351 rows: 1000000 tail: 132 index: 7936應該也是儲存在filefooter中,後面各個字段統計資訊對應圖1-orc檔案結構圖中的index data和row data部分。

從dump檔案中的資料可以看出,每個欄位的row_index以及data資訊是儲存在一塊連續空間中的,這塊檔案從offset=3開始。這也說明圖1-orc檔案結構圖中row data區的資料緊隨index data區資料之後。

index data資料統計:

起始位置

欄位3……21

struct

22……1141

category_id

1142……3056

product_id

3057……5135

brand_id

5136……7201

price

7202……7938

category_id_2

row data資料統計:

起始位置

字段描述

7939……59887

category_id

字段對應詞條int流

59888……59898

category_id

詞條長度int流

59899……60989

category_id

字典詞條資料

60990……3525432

product_id

實際資料int流

3525433……3527085

brand_id

標識if null的byte流

3527086……5708142

brand_id

實際資料int流

5708143……7855016

price

double型別

7855017……7855212

category_id_2

字段對應詞條int流

7855213……7855219

category_id_2

詞條長度int流

7855220……7855289

category_id_2

字典詞條資料

在orc檔案的int型別和string型別儲存時,會有乙個byte流用於記錄欄位的某個記錄是否為null,根據統計只有brand_id 欄位的count值不足100000條,也就是說除了brand_id 字段之外,其他欄位中沒有null值。所以在上面row data表中,只有brand_id有乙個對應的if null標識流。乙個string型別,會將詞條資料儲存在位元組流中,然後乙個int流記錄每個詞條的長度,另外乙個int流用於指定字段某個記錄對應字典詞條中的哪乙個。

這部分最後記錄了每乙個欄位的儲存方式,統計如下

字段型別

儲存方式

struct

direct

category_id

string

dictionary_v2

product_id

intdirect_v2

brand_id

intdirect_v2

price

double

direct

category_id_2

string

dictionary_v2

Hive ORC檔案儲存格式

orc檔案格式是從hive 0.11版本開始的。關於orc檔案格式的官方文件,以及基於官方文件的翻譯內容這裡就不贅述了,有興趣的可以仔細研究了解一下。本文接下來根據 major technical advancements in apache hive 中的內容進行深入的研究。orc的全稱是 opt...

pcap檔案格式 續

pcap檔案格式 pcap檔案格式是bpf儲存原始資料報的格式,很多軟體都在使用,比如tcpdump wireshark等等,了解pcap格式可以加深對原始資料報的了解,自己也可以手工構造任意的資料報進行測試。pcap檔案的格式為 檔案頭 24位元組 資料報頭 資料報 資料報頭為16位元組,後面緊跟...

HIVE檔案儲存格式

hive檔案儲存格式包括以下幾類 textfile sequencefile rcfile orcfile 其中textfile為預設格式,建表時不指定預設為這個格式,匯入資料時會直接把資料檔案拷貝到hdfs上不進行處理。sequencefile,rcfile,orcfile格式的表不能直接從本地檔...