一、Spark SQL 与 Presto 之间的差异
Presto
简单来说就是“SQL 查询引擎”,初是为Apache Hadoop开发的。它是一个开源分布式 SQL 查询引擎,旨在针对各种规模的数据集运行交互式分析查询。
Spark SQL
是一种分布式内存计算引擎,在结构化和半结构化数据集之上有一个 SQL 层。由于它在内存中处理,因此在 Spark SQL 中处理速度会很快。
二、 Spark SQL 和 Presto 对比
SQL vs Presto 对比项 | Presto | Spark SQL |
生态系统/平台 | Hadoop、大数据处理等 | Spark 框架、大数据处理等 |
目的 | Presto 设计用于在大数据(巨大的工作负载)上运行 SQL 查询。 它是由 Facebook 设计的,用于处理他们巨大的工作量。 | Spark SQL 是 Apache Spark Core 的组件之一。 Spark Core 是 Spark 平台的基础执行引擎 |
安装 |
|
|
能力/特点 | Presto 允许对多个数据源进行数据查询;例如,数据可能驻留在数据存储中:Hive、Cassandra、RDBMS 和其他一些专有数据存储。 | Spark SQL 使用数据框架和 JDBC 连接器提供了与其他数据源集成的灵活性。 |
支持连接器 | Presto 支持可插拔连接器。这些连接器为查询提供数据集。 下面是 presto 中可用的几个预先存在的连接器,而 Presto 也提供了与自定义连接器连接的能力。
| Data Frame 接口允许不同的数据源在 Spark SQL 上工作。 Spark SQL 包括具有行业标准 JDBC 和 ODBC 连接的服务器模式。 |
联合查询 | Presto 支持联合查询。Presto 可以配置为连接不同的 DB,并且一旦配置;它的 CLI 可用于启动“联合查询”。 在一个 Presto 查询中,用户可以组合来自多个数据源的数据并运行查询。 | Spark SQL 带有一个内置功能,可以使用 JDBC 连接其他数据库,即“JDBC 到其他数据库”,它有助于联邦功能。 Spark SQL 带有一个内置功能,可以使用 JDBC 连接其他数据库,即“JDBC 到其他数据库”,它有助于联邦功能。 |
谁使用? | 数据分析师、数据工程师、数据科学家等 | 数据分析师、数据工程师、数据科学家、Spark 开发人员等 |
三、SparkSQL/PrestoSQL 语法差异
id | Spark SQL | Presto SQL | 差异 |
1 | date_add(start_date, num_days) | date_add(unit, value, timestamp) unit = second,minute,hour,day,week,month,quarter,year | 1)函数入参不一样 |
2 | datediff(endDate, startDate) SELECT datediff('2009-07-31', '2009-07-30'); | date_diff(unit, timestamp1, timestamp2) unit = second,minute,hour,day,week,month,quarter,year Returns timestamp2 - timestamp1 expressed in terms of unit. | 1)函数名称不一样,下划线 2)函数入参顺序不一样,相反 |
3 | 1.current_date获取当前日期 2018-04-09 2.current_timestamp/now()获取当前时间 2018-04-09 15:20:49.247 | current_date current_time current_timestamp | |
4 | 1.unix_timestamp返回当前时间的unix时间戳 SELECT unix_timestamp('2016-04-08', 'yyyy-MM-dd'); 1460041200 2.from_unixtime将时间戳换算成当前时间,to_unix_timestamp将时间转化为时间戳 SELECT from_unixtime(0, 'yyyy-MM-dd HH:mm:ss'); 1970-01-01 00:00:00 SELECT to_unix_timestamp('2016-04-08', 'yyyy-MM-dd'); 1460041200 | from_unixtime(unixtime) from_unixtime(unixtime, string) | |
5 | to_date/date将字符串转化为日期格式,to_timestamp(Since: 2.2.0) | ||
6 | add_months返回日期后n个月后的日期 SELECT add_months('2016-08-31', 1); 2016-09-30 | ||
7 | last_day(date),next_day(start_date, day_of_week) SELECT last_day('2009-01-12'); 2009-01-31 | ||
8 | trunc截取某部分的日期 第二个参数 ["year", "yyyy", "yy", "mon", "month", "mm"] SELECT trunc('2009-02-12', 'MM'); 2009-02-01 date_trunc ["YEAR", "YYYY", "YY", "MON", "MONTH", "MM", "DAY", "DD", "HOUR", "MINUTE", "SECOND", "WEEK", "QUARTER"] SELECT date_trunc('2015-03-05T09:32:05.359', 'HOUR'); 2015-03-05T09:00:00 | date_trunc(unit, x) unit = second,minute,hour,day,week,month,quarter,year | 函数参数不一样 |
9 | SELECT date_format('2016-04-08', 'y'); | ||
10 | nvl(xxxx,'') | coalesce(xxx,'') | 函数名不一样 |
11 | select get_json_object(json_str, '$.name'); | json_extract_scalar(json_str, '$.name') | get单层json 函数名不一样 |
12 | get_json_object(json_str, '$.item.tabid'); | json_extract_scalar(json_str, '$.item.tabid') | get多层json 函数名不一样 |
13 | get_json_object(json_str, '$.item.uss_rule[0]'); | json_extract(json_str, '$.item.uss_rule[0]') | get json数组 函数名不一样 |
14 | msg['isBackgroundMode'] | element_at(msg,'isBackgroundMode') | hashmap元素的引用 语法格式不一样 |
15 | select student, score from tests lateral view explode(split(scores, ',')) t as score; | select student, score from tests cross json unnest(split(scores, ',') as t (score); | 列转行 语法格式不一样 |
16 |
四、结论
Spark SQL 和 Presto 都是市场上可用的 SQL 分布式引擎。
Presto 在涉及 BI 类型查询时非常有用,而 Spark SQL 在大型分析查询中在性能方面处于领先地位。在配置方面进行比较时,Presto 设置比 Spark SQL 容易。Spark SQL 和 Presto 都站在市场上并解决不同类型的业务问题。
参考:https://www.educba.com/spark-sql-vs-presto/?source=leftnav