ORC是RCfile的優化版本
1. 關于hive的文件格式
-
TEXTFILE
默認格式,建表時不指定默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理。源文件可以直接通過hadoop fs -cat 查看
-
SEQUENCEFILE
一種Hadoop API提供的二進制文件,使用方便、可分割、可壓縮等特點。SEQUENCEFILE將數據以<key,value>的形式序列化到文件中。
-
RCFILE
一種行列存儲相結合的存儲方式。首先,其將數據按行分塊。其次,將塊數據列式存儲,有利于數據壓縮和快速的列存取。
HDFS Blocks是16字節的HDFS同步塊信息,主要包括該行組內的 儲的行數、列的字段信息#等等。
優勢 在一般的行存儲中 select a from table,雖然只是取出一個字段的值,但是還是會遍歷整個表,所以效果和select * from table 一樣,在RCFile中,像前面說的情況,只會讀取該行組的一行。
在一般的列存儲中,會將不同的列分開存儲,這樣在查詢的時候會跳過某些列,但是有時候存在一個表的有些列不在同一個HDFS塊上(如下圖),所以在查詢的時候,Hive重組列的過程會浪費很多IO開銷。
劣勢 拷貝到本地目錄后RCFile并不是真正直接跳過不需要的列,并跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。
-
ORC
hive給出的新格式,屬于RCFILE的升級版。
Postscripts中存儲該表的行數,壓縮參數,壓縮大小,列等信息
Stripe Footer中包含該stripe的統計結果,包括Max,Min,count等信息
FileFooter中包含該表的統計結果,以及各個Stripe的位置信息
IndexData中保存了該stripe上數據的位置信息,總行數等信息
RowData以stream的形式保存了數據的具體信息
Hive讀取數據的時候,根據FileFooter讀出Stripe的信息,根據IndexData讀出數據的偏移量從而讀取出數據。
ORC文件不僅僅是一種列式文件存儲格式,最重要的是有著很高的壓縮比,并且對于MapReduce來說是可切分(Split)的。因此,在Hive中使用ORC作為表的文件存儲格式,不僅可以很大程度的節省HDFS存儲資源,而且對數據的查詢和處理性能有著非常大的提升,因為ORC較其他文件格式壓縮比高,查詢任務的輸入數據量減少,使用的Task也就減少了。
-
自定義格式
用戶的數據文件格式不能被當前 Hive 所識別的時通過實現inputformat和outputformat來自定義輸入輸出格式,
相關建表語句參見:[http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843318.html]
查看ORC文件信息
建表時指定使用ORC存儲方式,注意需要將ORC的表中的NULL取值,由默認的\N改為' '
CREATE TABLE ... STORED AS ORC tblproperties('orc.compress'='SNAPPY')
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc
以STORED AS ORC為例介紹相關的實驗參數
create table Addresses (
name string,
street string,
city string,
state string,
zip int
) stored as orc tblproperties ("orc.compress"="NONE");
參數(在在Hive QL語句的tblproperties字段里面出現):
Key Default Notes
orc.compress ZLIB high level compression (one of NONE, ZLIB, SNAPPY)
orc.compress.size 262,144 number of bytes in each compression chunk
orc.stripe.size 268435456 number of bytes in each stripe
orc.row.index.stride 10,000 number of rows between index entries (must be >= 1000)
orc.create.index true whether to create row indexes
查看ORC存儲方式
hive --orcfiledump <location-of-orc-file>
例子:庫名,表名:fileformat.db,test_orc
hive --orcfiledump /user/hive/warehouse/fileformat.db/test_orc/000000_0
查詢結果如下所示:
將臨時表導入到ORC表中
insert overwrite table http_orc partition(dt='2013-09-30') select p_id,tm,idate,phone from tmp_testp where dt='2013-09-30'
直接load文本的方式use search_index; load data local inpath '$data_dir/category_en.txt' into table ${table_name} partition(dt='${table_dt}因為ORC類似于索引的統計結構,不適用。