(部分轉載)Presto上使用SQL遇到的一些坑

遇到過的問題:sql

不少的時候,在Presto上對數據庫跨庫查詢,例如Mysql數據庫。這個時候Presto的作法是從MySQL數據庫端拉取最基本的數據,而後再去作進一步的處理,例如統計等聚合操做。
舉個栗子:數據庫

SELECT count(id) FROM table_1 WHERE condition=1;

上面的SQL語句會分爲3個步驟進行:
1.Presto發起到Mysql數據庫進行查詢大數據

SELECT id FROM table_1 WHERE condition=1;

 2.對結果進行count計算
 3.返回結果
因此說,對於Presto來講,其跨庫查詢的瓶頸是在數據拉取這個步驟。若要提升數據統計的速度,可考慮把Mysql中相關的數據表按期轉移到HDFS中,並轉存爲高效的列式存儲格式ORC。spa

因此定時歸檔是一個很好的選擇,這裏還要注意,在歸檔的時候咱們要選擇一個歸檔字段,若是是按日歸檔,咱們能夠用日期做爲這個字段的值,採用yyyyMMdd的形式,例如20180123.rest

通常建立歸檔數據庫的SQL語句以下:code

CREATE TABLE IF NOT EXISTS table_1 (
id INTEGER,
........
partition_date INTEGER
)WITH ( format = 'ORC', partitioned_by = ARRAY['partition_date'] ); 

查看建立的庫結構:orm

SHOW CREATE TABLE table_1; /*Only Presto*/

帶有分區的表建立完成以後,天天只要更新分區字段partition_date就能夠了,聰明的Presto就能將數據放置到規劃好的分區了。it

若是要查看一個數據表的分區字段是什麼,能夠下面的語句:io

SHOW PARTITIONS FROM table_1 /*Only Presto*/

查詢條件中儘可能帶上分區字段進行過濾

若是數據被規當到HDFS中,並帶有分區字段。在每次查詢歸檔表的時候,要帶上分區字段做爲過濾條件,這樣能夠加快查詢速度。由於有了分區字段做爲查詢條件,就能幫助Presto避免全區掃描,減小Presto須要掃描的HDFS的文件數。table

多多使用WITH語句
使用Presto分析統計數據時,可考慮把屢次查詢合併爲一次查詢,用Presto提供的子查詢完成。
這點和咱們熟知的MySQL的使用不是很同樣。
例如:

WITH subquery_1 AS (
    SELECT a1, a2, a3 
    FROM Table_1 
    WHERE a3 between 20180101 and 20180131
),               /*子查詢subquery_1,注意:多個子查詢須要用逗號分隔*/
subquery_2 AS (
    SELECT b1, b2, b3
    FROM Table_2
    WHERE b3 between 20180101 and 20180131
)                /*最後一個子查詢後不要帶逗號,否則會報錯。*/        
SELECT 
    subquery_1.a1, subquery_1.a2, 
    subquery_2.b1, subquery_2.b2
FROM subquery_1
    JOIN subquery_2
    ON subquery_1.a3 = subquery_2.b3;

利用子查詢,減小讀表的次數,尤爲是大數據量的表 具體作法是,將使用頻繁的表做爲一個子查詢抽離出來,避免屢次read。

相關文章
相關標籤/搜索