一、關於ORC文件格式( ORC從Hive0.11開始引入)
ORC(Optimized Row Columnar)格式可以高效地存儲Hive數據,被設計用來規避其他文件格式存在的缺陷,使用ORC文件格式可以提升Hive讀、寫與處理數據的性能。ORC文件格式有以下優點:
1、一個任務的輸出對應一個文件,從而減輕Namenode的負載壓力
2、Hive可以支持datetime,decimal和其他複雜類型(包括struct,list,map,union)
3、使用存儲在文件中的輕型索引,可以
(1)跳過那些沒有經過預複選的行
(2)定位指定的行
4、基於數據類型的塊模式壓縮
(1)對於整數列使用行程長度編碼
(2)對於字串列使用字典編碼
5、使用分離的RecordReaders對同一文件並行讀
6、不使用標籤(markers)就可以Split文件
7、爲讀寫操作固定所需的內存
8、元數據存儲在協議緩衝區(Protocol Buffers),它允許增加或者刪除一些列
二、文件結構
一個ORC文件包含多個stripes(每個stripes由多組行數據組成的),一個包含輔助信息的file footer。在文件的結尾,一個postscript保存着壓縮參數及被壓縮的footer的長度。一個stripes缺省大小是250MB,其大小可以擴展的長度只受HDFS的約束。file footer包含文件中的一個記錄stripes信息的列表、每個stripes中行的數目及每個列的數據類型,它也包含列級的聚合結果:count, min, max, and sum。結構如下圖所示:
如上圖所示,在ORC文件中,每個Stripe包括索引數據、行數據及一個Stripe footer。Stripe footer包含了用於流定位的目錄,Row data用於表掃描。索引數據(Indexdata)包括每個列的最小與最大值,以及它們在每個列的行號,行索引項(Rowindex entries)記錄了壓縮塊及解壓後字節的偏移。需要注意的是,ORC索引只是被用來選擇Stripe和行組,而不會被用於返回查詢結果。擁有相對頻繁的行索引條目,可以爲了快速的數據讀取而跳過一些行,缺省情況下每次最多可以跳過10000行。ORC有能力基於過濾謂詞跳過非常多的行,可以使用第二關鍵字進行對錶進行排序,以達到減少查詢執行時間的效果。例如,如果主關鍵字是交易日期,表可以按照州、郵編或者姓名進行排序,當按照州查詢記錄的時候將跳過非目標州的記錄。
三、使用ORC的HiveQL語法
可以在表級或者分區級指定文件的格式,對錶或分區設置ORC格式的HiveQL命令示例如下
CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc
ORC格式的參數通過TBLPROPERTIES來指定,支持的參數有:
關鍵字 |
缺省值 |
說明 |
orc.compress |
ZLIB |
壓縮方法(NONE, ZLIB, SNAPPY) |
orc.compress.size |
262,144 |
每個壓縮塊的字節數 |
orc.stripe.size |
268435456 |
每個stripe的字節數 |
orc.row.index.stride |
10,000 |
索引項之間的行數(number of rows between index entries),至少爲1000 |
orc.create.index |
true |
是否創建行索引 |
下面的例子創建了一個沒有壓縮的ORC格式表:
create table Addresses (
name string,
street string,
city string,
state string,
zip int
) stored as orc tblproperties ("orc.compress"="NONE");
注:關於ORC的序列化與壓縮的文檔實在晦澀難懂,也沒有找到更詳細的說明材料,在此暫時不對其進行譯解。