接着上一章我們講的hive的連接配接政策,現在我們講一下hive的資料存儲。
下面是hive支援的資料存儲格式,有我們常見的文本,json,xml,這裡我們主要講一下orcfile。
built-in formats:
– orcfile
– rcfile
– avro
– delimited text
– regular expression
– s3 logfile
– typed bytes
• 3
rd
-party addons:
– json
– xml

這種格式非常适合hdfs,它有以下的<b>優點</b>:
•高壓縮
– 高壓縮比.
– 字典編碼.
•高性能
– 自帶索引.
– 高效的精确查詢.
• 靈活的資料模型
– 支援所有的hive類型,包括maps.
從圖中可以看出,orc格式的檔案存儲大小僅為文本的30%左右,比gz格式的都小,采用zlib壓縮的話,更小,僅有22%左右。
使用orc格式存儲的方式很簡單,在建表的時候stored as orc即可
相關參數,自己看,不解釋了。
不适用zlib壓縮的話,查詢速度更快,但是也大一些。
(1)跳躍讀取:采用分區partition或者使用skew,才用orcfile二次排序。
(2)在連接配接字段上排序并且bucket,在連接配接小表的時候采用broadcast joins。
(3)對經常使用的資料,增加備份因子,激活short-circuit read,采用tez。
當某個表很大的時候,我們往往要對其進行分區,比如按照時間來分區。
其中的xdate和state是不存在的列,你可以認為它們是虛拟列,虛拟列會在hdfs當中建立子目錄,屬于分區的記錄會存在那個子檔案夾中。
使用分區之後,在查詢和插入的時候,就必須帶有至少一個分區字段,否則查詢将會失敗。
如果你想一次查出所有資料,不想受這個限制的話,你可以 hive.exec.dynamic.partition.mode參數置為nonstrict。
有時候插入資料的時候,我們需要重新排序,在select 語句裡面把虛拟列也加上,這樣會有排序的效果。
mapred.max.split.size和mapred.min.split.size
min 太大-> 太少mapper.
max 太小-> mapper太多.
example:
– set mapred.max.split.size=100000000;
– set mapred.min.split.size=1000000;
當然也有個原則,當mappers出現搶占資源的時候,才調整這些參數。
– set io.sort.mb=100;
• all the time:
– set hive.optmize.mapjoin.mapreduce=true;
– set hive.optmize.bucketmapjoin=true;
– set hive.optmize.bucketmapjoin.sortedmerge=true;
– set hive.auto.convert.join=true;
– set hive.auto.convert.sortmerge.join=true;
– set hive.auto.convert.sortmerge.join.nocondi1onaltask=true;
• when bucketing data:
– set hive.enforce.bucketing=true;
– set hive.enforce.sortng=true;
• these and more are set by default in hdp 1.3(明顯的廣告詞,說明hdp比較強大,已經給我們設定好了).
這些參數我們可以在hive-site.xml中查詢到,我們也可以在shell中查詢。
(1)查詢所有的參數
(2)查詢某一個參數
(3)修改參數