(部分转载)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。

相关文章
相关标签/搜索