本文在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格式的表不能直接從本地檔...