天天看點

hive中groupby優化_Hive基礎重點知識+優化(個人總結)

Hive基礎

Hive簡介:(1)hql相對于MR程式沒有複雜的代碼,上手簡單,會寫sql的同學,hql也不在話下,差別不是很大。(2)Hive作為資料倉庫使用,工作中常用的就是資料的查詢(select)和加載(insert)

1、 内部表和外部表的差別:内部表删除中繼資料和真實資料,外部表隻删除中繼資料

2、 一般建立内部表的時候,不指定location的位置,一般放在預設的hive倉庫路                                             徑:/user/hive/warehouse/;外部表最好指定location

3、存儲格式:(1)、textfile:預設存儲格式,行存儲,磁盤和資料解析開銷大,壓縮的text檔案 hive無法進行合并和拆分。(2)、sequencefile:二進制鍵值對行存儲,可分割,壓縮,一般選擇block壓縮,優勢是檔案和hadoop api mapfile是互相相容的。(3)、rcfile:存儲方式:資料按行分塊,每塊按照列存儲,壓縮快,快速列存取,讀記錄盡量涉及到的block最少 ,讀取需要的列隻需要讀取每個row group的頭部定義,讀取全量資料的操作性能可能比sequencefile沒有明顯的優勢。(4)、orc:存儲方式:按行分塊,按列存儲,壓縮快,快速列存取,效率的rcfile高,改良版。(5)、自定義格式:可以通過實作inputformat來定義輸入輸出格式

4、常用語句(我就不分類了):(1)、查詢表結構: desc 表名;  (2)、顯示庫:show databases; (3)、選擇庫:use 庫名; (4)、顯示庫下所有表:show tables; (5)、查詢創表語句:show create table 表名; (6)、查詢 select 字段 from 表名 (join 表名 on 表連接配接條件)  where 條件  group by 字段  having 條件 order by 字段 limit 數字 (7)、加載:load data local inpath "/.txt" into table 表名 (8)、插入資料:insert (override) table 表名 partition(分區字段) select ......

5、cluster by 和sort by 不能連用,distribute by age sort by id ; 分桶;left semi join 隻顯示左面的表 半連接配接效率高

6、經典的視窗函數:select * from(select a.movietype,a.movieid,b.avgrate,row_number() over(distribute by movietype sort by avgrate desc) as rn  from result_8_1 a join result_8_2 b on (a.movieid=b.movieid)) abwhere ab.rn<=5;

7、視窗函數(三種):row_number() over(distribute by  sort by )  12345 ;rank() over() 12335 ; dense_rank() over() 12334

8、執行順序:from->where ->group by ->having-> select->distinct-> 别名-> order by ->

9、hql中 select中的字段必須要在group中存在,否則報錯

10、hive -i 腳本   初始化指令;     hive -e "";    hive -f 腳本 -hiveconf hive.exec.mode.local.auto=true ;  hive -S 隻輸出結果

11、group by 和 join 容易資料傾斜,資料傾斜的原因: shuffle 階段 造成reduce 配置設定不均,資料傾斜直接結果:效率低,閑置資源多,任務錯誤指數上升

12、常用的日期函數,自行搜尋,網上很多,這個工作中使用特别多

13、一些常用函數:concat、concat_ws、instr、substr ,聚合函數max、count等等

14、寫腳本時可能和python 連用,需要加 add file *.py  SELECT TRANSFORM(tmp.*)

USING 'python *.py'

Hive優化

1、多表連接配接join 會緩存左邊的表  小表寫前面

2、笛卡爾積優化:構造随機連接配接,有多少不同連接配接,就複制多少份小表緩存到記憶體中,在和大表join,隻要記憶體夠就可以進行mapjoin

3、set hive.exec.mode.local.auto=true; 本地模式

set hive.merge.mapfiles = true ## 在 map only  的任務結束時合并小檔案

set hive.merge.mapredfiles = false ## true  時在 MapReduce  的任務結束時合并小檔案

set hive.merge.size.per.task = 256000000 ## 合并檔案的大小

set mapred.max.split.size=256000000; ## 每個 Map  最大分割大小

set mapred.min.split.size.per.node=1; ## 一個節點上 split  的最少值

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;s## 執行 Map前合并小檔案

設定maptask數量

long splitSize = Math.max(minSize, Math.min(maxSize, blockSize))輸入的分片大小(取中)

1 、  減少 MapTask  數是通過 合并小檔案來實作 ,這一點主要是針對資料源

2 、  增加 MapTask  數可以通過控制上一個 job  的 reduceTask  個數set

set mapred.job.reuse.jvm.num.tasks=5   需要重用jvm,JVM的啟動時間會變成一個比較大的消耗

設定reduceTask 的 數量

1、hive.exec.reducers.bytes.per.reducer(預設為 256000000)

2、hive.exec.reducers.max(預設為 1009)

3、mapreduce.job.reduces=-1(設定一個常量 reducetask 數量)

依據 Hadoop  的經驗,可以将參數 2  設定為 0.95*( 叢集中 datanode  個數)

資料傾斜join優化

set hive.skewjoin.key=100000; // 這個是 join 的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定

set hive.optimize.skewjoin=true; // 如果是 join 過程出現傾斜應該設定為 true

group by 優化       (MapReduce 的 combiner 元件)

set hive.map.aggr = true 是否在 Map 端進行聚合,預設為 True

set hive.groupby.mapaggr.checkinterval = 100000 在 Map 端進行聚合操作的條目數目

set hive.groupby.skewindata = true政策就是把 MR  任務拆分成兩個:第一個先做預彙總,第二個再做 最終 彙總

并行化

set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=8; // 同一個 sql允許并行任務的最大任務數

壓縮

set hive.exec.compress.output=true // 預設值是 false,不壓縮

set hive.exec.compress.intermediate=true // 預設值是 false,為 true 時 MR 設定的壓縮才啟用

作者:Reyn_93

連結:https://www.jianshu.com/p/c5a1c4662016