Hive ORC

ORC是RCfile的優化版本

1. 關于hive的文件格式

  • TEXTFILE

    默認格式,建表時不指定默認為這個格式,導入數據時會直接把數據文件拷貝到hdfs上不進行處理。源文件可以直接通過hadoop fs -cat 查看

  • SEQUENCEFILE

    一種Hadoop API提供的二進制文件,使用方便、可分割、可壓縮等特點。SEQUENCEFILE將數據以<key,value>的形式序列化到文件中。

  • RCFILE

    一種行列存儲相結合的存儲方式。首先,其將數據按行分塊。其次,將塊數據列式存儲,有利于數據壓縮和快速的列存取。


按行劃分.png

HDFS Blocks是16字節的HDFS同步塊信息,主要包括該行組內的 儲的行數、列的字段信息#等等。
優勢 在一般的行存儲中 select a from table,雖然只是取出一個字段的值,但是還是會遍歷整個表,所以效果和select * from table 一樣,在RCFile中,像前面說的情況,只會讀取該行組的一行。

按列存儲.png

在一般的列存儲中,會將不同的列分開存儲,這樣在查詢的時候會跳過某些列,但是有時候存在一個表的有些列不在同一個HDFS塊上(如下圖),所以在查詢的時候,Hive重組列的過程會浪費很多IO開銷。

劣勢 拷貝到本地目錄后RCFile并不是真正直接跳過不需要的列,并跳到需要讀取的列, 而是通過掃描每一個row group的頭部定義來實現的,所以在讀取所有列的情況下,RCFile的性能反而沒有SequenceFile高。

  • ORC

hive給出的新格式,屬于RCFILE的升級版。

3162138-9ed6b55adb0391dc.png
Postscripts中存儲該表的行數,壓縮參數,壓縮大小,列等信息
Stripe Footer中包含該stripe的統計結果,包括Max,Min,count等信息
FileFooter中包含該表的統計結果,以及各個Stripe的位置信息
IndexData中保存了該stripe上數據的位置信息,總行數等信息
RowData以stream的形式保存了數據的具體信息

3162138-a2c0c0eef32bc613.png

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

查詢結果如下所示:


3162138-00a6cad1dc954c52.png

將臨時表導入到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類似于索引的統計結構,不適用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ORC是RCfile的優化版本 關于Hive的文件格式 TEXTFILE 默認格式,建表時不指定默認為這個格式,...
    analanxingde閱讀 10,879評論 0 5
  • 目錄 一、概述 二、關鍵詞,非保留關鍵字和保留關鍵字 三、創建/刪除/修改/使用數據庫3.1、 創建數據庫3.2、...
    三分清醒閱讀 1,395評論 0 1
  • Hive Hive簡介 Facebook為了解決海量日志數據的分析而開發了Hive,后來開源給了Apache軟件基...
    高廣超閱讀 16,677評論 1 21
  • 1、給用戶賦予權限 2、數據庫新建/刪除操作 創建數據庫 查看所有的數據庫 進入某個數據庫 刪除數據庫 3、hiv...
    雪飄千里閱讀 926評論 0 2
  • Hive基本操作 Hive產生背景: mapreduce編程的不便性HDFS上文件缺少Schema (Schema...
    wong11閱讀 3,565評論 0 2