PrestoDB-SQL

fansichao 2021-10-23 16:25:17
Categories: Tags:

软件简介

什么是 Presto 或 PrestoDB?

Presto 徽标

Presto(或 PrestoDB)是一种开源的分布式 SQL 查询引擎,从头开始设计用于针对任何规模的数据进行快速分析查询。它既可支持非关系数据源,例如 Hadoop 分布式文件系统 (HDFS)、Amazon S3、Cassandra、MongoDB 和 HBase,又可支持关系数据源,例如 MySQL、PostgreSQL、Amazon Redshift、Microsoft SQL Server 和 Teradata。

Presto 可在数据的存储位置查询数据,无需将数据移动到独立的分析系统。查询执行可在纯粹基于内存的架构上平行运行,大多数结果在几秒内即可返回。您将会发现,它已被许多知名公司采用,例如 Facebook、Airbnb、Netflix、Atlassian 和 Nasdaq。

Presto 的发展历史

Presto 最初作为 Facebook 的项目启动,针对 300PB 的数据仓库运行交互式分析查询,使用大型基于 Hadoop/HDFS 的集群构建。在构建 Presto 之前,Facebook 使用的是 2008 年创建并推出的 Apache Hive,为 Hadoop 生态系统带来熟悉的 SQL 语法。Hive 在将复杂的 Java MapReduce 作业简化成类似 SQL 的查询方面对 Hadoop 生态系统有着重大影响,同时还能够执行大规模的任务。但是,它未针对交互式查询所需的高速性能进行优化。

在 2012 年,Facebook 数据基础设施组构建了 Presto,这种交互式查询系统能够以 PB 级规模快速运行。它于 2013 年春季在全公司范围内推广。2013 年 11 月,Facebook 将 Presto 作为 Apache 软件许可证下的开源软件,任何人都可以从 Github 上下载。今天,Presto 已成为在 Hadoop 上进行交互式查询的流行选择,获得了来自 Facebook 和其他组织的大量贡献。Facebook 的 Presto 实施的使用者超过一千名员工,他们每天运行超过 30000 次查询,处理的数据达到 1PB。

Presto 工作原理

Presto 是在 Hadoop 上运行的分布式系统,使用与经典大规模并行处理 (MPP) 数据库管理系统相似的架构。它有一个协调器节点,与多个工作线程节点同步工作。用户将其 SQL 查询提交给协调器,由其使用自定义查询和执行引擎进行解析、计划并将分布式查询计划安排到工作线程节点之间。它设计用于支持标准 ANSI SQL 语义,包括复杂查询、聚合、联接、左/右外联接、子查询、开窗函数、不重复计数和近似百分位数。

查询编译之后,Presto 将请求处理到工作线程节点之间的多个阶段中。所有处理都在内存中进行,并以流水线方式经过网络中的不同阶段,从而避免不必要的 I/O 开销。添加更多工作线程节点可提高并行能力,并加快处理速度。

为了使 Presto 可扩展到任何数据源,它的设计采用了存储抽象化,以便于轻松地构建可插入的连接器。因此,Presto 拥有大量连接器,既可用于非关系数据源,例如 Hadoop 分布式文件系统 (HDFS)、Amazon S3、Cassandra、MongoDB 和 HBase,又可用于关系源,例如 MySQL、PostgreSQL、Amazon Redshift、Microsoft SQL Server 和 Teradata。数据在其存储位置接受查询,无需将其移动到独立的分析系统中。

语法介绍

1

常用命令

Base Command

1
show tables:

格式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
-- 基础格式转换
-- cast: 转换为指定类型
presto:db_ods_test> select cast('2021-01-01' as date);
_col0
------------
2021-01-01
(1 row)
-- try_cast: 类型转换,支持 异常数据的转换. 避免由数据错误导致程序错误
presto:db_ods_test> select try_cast('2019-01-22 08:05558:08' as timestamp);
_col0
-------
NULL
(1 row)
-- 返回当前日期
presto:db_ods_test> select current_date,now();
_col0 | _col1
------------+---------------------------------------
2021-03-29 | 2021-03-29 11:24:08.734 Asia/Shanghai
(1 row)




-- format_datetime: timestamp 转为 指定格式字符串
presto:db_ods_test> select format_datetime(cast('2021-01-01 00:00:00.000' as timestamp),'yyyyMMdd') ;
_col0
----------
20210101
(1 row)
-- date_format: 字符串时间格式转换
presto:db_ods_test> select date_format(date_parse('20210101','%Y%m%d'),'%Y-%m-%d');
_col0
------------
2021-01-01
(1 row)
-- to_unixtime: 时间戳 转 unix 格式
presto:db_ods_test> select to_unixtime(try_cast('2019-01-22 08:05:08' as timestamp));
_col0
---------------
1.548115508E9
(1 row)
-- from_unixtime: unix 转时间戳格式
presto:db_ods_test> select from_unixtime(to_unixtime(try_cast('2019-01-22 08:05:08' as timestamp)));
_col0
-------------------------
2019-01-22 08:05:08.000
(1 row)
-- format_datetime: 调整时间格式
presto:db_ods_test> select format_datetime(cast('2019-01-22 08:05:08' as timestamp),'yyyy-MM-dd HH:mm:ss');
_col0
---------------------
2019-01-22 08:05:08
(1 row)
-- date: 返回日期表达式
presto:db_ods_test> select date(cast('2021-01-01 00:00:00' as timestamp));
_col0
------------
2021-01-01
(1 row)


Tips命令

1
2
3
4
5
6
-- 提取 HOST
presto:db_ods_test> select url_extract_host('http://192.168.1.1//query/abc');
_col0
-------------
192.168.1.1
(1 row)

参考资源