合理設定分割槽
與hive類似,presto會根據元資訊讀取分割槽資料,合理的分割槽能減少presto資料讀取量,提公升查詢效能。
使用列式儲存
presto對orc檔案讀取做了特定優化,因此在hive中建立presto使用的表時,建議採用orc格式儲存。相對於parquet,presto對orc支援更好。
使用壓縮預先排序
對於已經排序的資料,在查詢的資料過濾階段,orc格式支援跳過讀取不必要的資料。比如對於經常需要過濾的字段可以預先排序。
insert into table nation_orc partition
(p) select * from nation sort by n_name;
如果需要過濾n_name欄位,則效能將提公升。
select count
(*) from nation_orc where n_name=』australia』;
只選擇使用必要的字段
由於採用列式儲存,選擇需要的字段可加快欄位的讀取、減少資料量。避免採用*讀取所有字段。
[good]: select
time,user,host
from
tbl[bad]: select * from
tbl
過濾條件必須加上分割槽字段
對於有分割槽的表,where語句中優先使用分割槽字段進行過濾。acct_day是分割槽字段,visit_time是具體訪問時間
[good]: select time,user,host from tbl where acct_day=20171101
[bad]: select * from tbl where visit_time=20171101
group by語句優化
合理安排group by語句中欄位順序對效能有一定提公升。將group by語句中欄位按照每個欄位distinct資料多少進行降序排列。
[good]: select
group
byuid, gender
[bad]: select
group
bygender, uid
order by時使用limit
order by需要掃瞄資料到單個worker節點進行排序,導致單個worker需要大量記憶體。如果是查詢top n或者bottom n,使用limit可減少排序計算和記憶體壓力。
[good]: select * from
tblorder
bytime
limit 100
[bad]: select * from
tblorder
bytime
使用近似聚合函式
用regexp_like代替多個like語句
presto查詢優化器沒有對多個like語句進行優化,使用regexp_like對效能有較大提公升
[good]
select
...from
access
where
regexp_like(method, 'get|post|put|delete')
[bad]
select
...from
access
where
method like '%get%'
or method like '%post%'
or method like '%put%'
or method like '%delete%'
使用join語句時將大表放在左邊
presto中join的預設演算法是broadcast join,即將join左邊的表分割到多個worker,然後將join右邊的表資料整個複製乙份傳送到每個worker進行計算。如果右邊的表資料量太大,則可能會報記憶體溢位錯誤。
[good] select ... from large_table l join small_table s on l.id = s.id
[bad] select ... from small_table s join large_table l on l.id = s.id
使用rank函式代替row_number函式來獲取top n
在進行一些分組排序場景時,使用rank函式效能更好
[good]
select checksum
(rnk)
from
( select rank()
over
(partition by l_orderkey, l_partkey order by l_shipdate desc) as rnk
from lineitem
) twhere rnk = 1
[bad]
select checksum
(rnk)
from
( select row_number()
over
(partition by l_orderkey, l_partkey order by l_shipdate desc) as rnk
from lineitem
) twhere rnk = 1
create table bdc_dm.res_category(
channel_id1 int comment '1級渠道id',
province string comment '省',
city string comment '市',
uv int comment 'uv'
)comment 'example'
partitioned by (landing_date int comment '日期:yyyymmdd')
row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' lines terminated by '\n';
建立對應的orc表
create table bdc_dm.res_category_orc(
channel_id1 int comment '1級渠道id',
province string comment '省',
city string comment '市',
uv int comment 'uv'
)comment 'example'
partitioned by
(landing_date int comment '日期:yyyymmdd')
row format delimited fields terminated by '\t'
stored as orc
tblproperties
;
先將資料灌入orc表,然後更換表名
insert overwrite table bdc_dm.res_category_orc partition(landing_date)
select * from bdc_dm.res_category where landing_date >= 20171001;
alter table bdc_dm.res_category rename to bdc_dm.res_category_tmp;
alter table bdc_dm.res_category_orc rename to bdc_dm.res_category;
其中res_category_tmp是乙個備份表,若線上執行一段時間後沒有出現問題,則可以刪除該錶。
orc和parquet都支援列式儲存,但是orc對presto支援更好(parquet對impala支援更好)
對於列式儲存而言,儲存檔案為二進位制的,對於經常增刪欄位的表,建議不要使用列式儲存(修改檔案元資料代價大)。對比資料倉儲,dwd層建議不要使用orc,而dm層則建議使用
資料查詢 Presto
目錄 1 基本原理 2 軟體安裝 3 命令 簡介 presto是一款基於記憶體的平行計算的分布式sql互動式查詢引擎.其查詢原理是不把資料全部放到記憶體,只是在計算中拿出一部分放在記憶體 計算 丟擲 再拿.它具有支援多資料來源 支援sql 支援擴充套件 可以自己擴充套件新的connector 支援混...
Presto(4)presto客戶端查詢儲存成檔案
因為沒有把前面的整理出來,所以就先把後邊presto要寫的知識點寫一下。對於想實現類似於hive e 或者是hive f 的功能,之後重定向查詢的檔案中這種功能,presto當然也提供了。可以想象presto為快速版的hive,對於想要快速的出資料非常有效 當然對於大資料表的join支援不是很好,但...
Presto查詢hive欄位為json型別的方法
針對樣例資料做示例說明 hive employee表的xjson欄位,只有一條資料 select get json object xjson,0 age from employee limit 1 presto 我們分步操作,先用 json array get 取出jsonarray的第乙個元素 s...