Hive中SQL的優化技巧

2021-07-09 03:05:43 字數 2929 閱讀 6593

hive中sql的優化技巧,核心思想是避免資料傾斜。

1、避免在同乙個查詢中同時出現count, distinct,group by

2、left join 時把小資料量的表放在前面

3、盡量使用子查詢

引數配置

set mapred.reduce.tasks=50;

set mapreduce.reduce.memory.mb=6000;

set mapreduce.reduce.shuffle.memory.limit.percent=0.06;

涉及資料傾斜的話,主要是reduce中資料傾斜的問題,可能通過設定hive中reduce的並行數,reduce的記憶體大小單位為m,reduce中 shuffle的刷磁碟的比例,來解決。

例項一

--分月

select substr(a.day,1,6)month,count(distinct a.userid)

from dms.tracklog_5min a

join default.site_activeuser_tmp c

on a.userid=c.id

where a.day>='201505' and a.day<'201506'

group by substr(a.day,1,6) ;

--優化後

select '201505',count(*) from

(select distinct c.userid

from

(select userid from default.site_activeuser_tmp where month='201505') c

left join

(select userid from

dms.tracklog_5min

where day>='201505' and day<'201506'

) tmp

on tmp.userid=c.userid

) t;

例項二

--分事業部

select substr(a.day,1,6)month,count(distinct a.userid) ,b.dept_name

from dms.tracklog_5min a join default.d_channel b

on a.host=b.host

join default.site_activeuser_tmp c

on a.userid=c.id

where a.day>='201505' and a.day<'201506'

group by substr(a.day,1,6),b.dept_name;

--優化後

set mapred.reduce.tasks=50;

set mapreduce.reduce.memory.mb=6000;

set mapreduce.reduce.shuffle.memory.limit.percent=0.06;

select "201505" month,count(t.userid),t.dept_name

from

(select userid from default.site_activeuser_tmp where month='201505') c

left join

(select distinct a.userid userid,b.dept_name dept_name from default.d_channel b

left join

(select host,userid from dms.tracklog_5min where day>='201505' and day<'201506' ) a

on a.host=b.host

)ton t.userid=c.userid

group by t.dept_name ;

例項三

--分產品

select substr(a.day,1,6)month,count(distinct a.userid) ,b.dept_name,b.prod_name

from dms.tracklog_5min a join default.d_channel b

on a.host=b.host

join default.site_activeuser_tmp c

on a.userid=c.id

where a.day>='201505' and a.day<'201506'

group by substr(a.day,1,6),b.dept_name,b.prod_name;

--優化後

select "201505" month,count(t.userid) cnt,t.dept_name dept_name,t.prod_name prod_name

from

(select userid from default.site_activeuser_tmp where month='201505') c

left join

(select distinct a.userid userid,b.dept_name dept_name,b.prod_name prod_name from default.d_channel b

left join

(select host,userid from dms.tracklog_5min where day>='201505' and day<'201506' ) a

on a.host=b.host

)ton t.userid=c.userid

group by t.prod_name,t.dept_name ;

SQL的優化技巧

一 一些常見的sql實踐 1 負向條件查詢不能使用索引 not in not exists都不是好習慣 可以優化為in查詢 2 前導模糊查詢不能使用索引 而非前導模糊查詢則可以 3 資料區分度不大的字段不宜使用索引 原因 性別只有男,女,每次過濾掉的資料很少,不宜使用索引。經驗上,能過濾80 資料時...

sql優化技巧

1.比較運算子能用 就不用 增加了索引的使用機率 2.事先知道只有一條查詢結果時,使用 limit 1 limit 1 可以避免全表掃瞄,找到對應結果就不會再繼續掃瞄了 3.選擇合適的資料型別很重要 能用tinyint就不用smallint,能用smallint就不用int,磁碟和記憶體消耗越小越好...

Hive小技巧及優化

查詢除了ds 和 hr 之外的所有列 select ds hr from sales 修改表生命週期 odps alter table table name set lifecycle days 正則匹配 匹配除 n 之外的任何單個字元。要匹配包括 n 在內的任何字元,請使用像 n 的模式。解析執行...