Spark SQL 与 Presto SQL 对比

2022-04-11 00:00:00 查询 数据 函数 时间 连接器

一、Spark SQL 与 Presto 之间的差异

Presto
简单来说就是“SQL 查询引擎”,初是为Apache Hadoop开发的。它是一个开源分布式 SQL 查询引擎,旨在针对各种规模的数据集运行交互式分析查询

Spark SQL
是一种分布式内存计算引擎,在结构化和半结构化数据集之上有一个 SQL 层。由于它在内存中处理,因此在 Spark SQL 中处理速度会很快。

二、 Spark SQL 和 Presto 对比

SQL vs Presto 对比项PrestoSpark SQL
生态系统/平台Hadoop、大数据处理等Spark 框架、大数据处理等
目的Presto 设计用于在大数据(巨大的工作负载)上运行 SQL 查询。
它是由 Facebook 设计的,用于处理他们巨大的工作量。
Spark SQL 是 Apache Spark Core 的组件之一。
Spark Core 是 Spark 平台的基础执行引擎
安装
  • Presto 是一个分布式 SQL 查询引擎,用于处理 pet 字节的数据,它在集群上运行,就像设置了一组机器一样。

  • 完整的 Presto 集群设置包括一个协调器(管理器节点)和多个工作器。用户从 Presto CLI 客户端向协调器提交查询。协调器解析、分析和计划查询执行,然后将查询处理分配给工作人员。

  • 如果您安装和配置 Apache Spark Cluster,Spark SQL 设置将是开箱即用的

  • Apache Spark 是 Hadoop 的子项目。

  • Apaches Spark 是一种基于集群的大数据处理技术,专为快速计算而设计。

能力/特点Presto 允许对多个数据源进行数据查询;例如,数据可能驻留在数据存储中:Hive、Cassandra、RDBMS 和其他一些专有数据存储。Spark SQL 使用数据框架和 JDBC 连接器提供了与其他数据源集成的灵活性。
支持连接器Presto 支持可插拔连接器。这些连接器为查询提供数据集。


下面是 presto 中可用的几个预先存在的连接器,而 Presto 也提供了与自定义连接器连接的能力。
下面是它支持的一些连接器

  • Hadoop/Hive

  • Cassandra

  • Teradata

  • PostgreSQL

  • Oracle etc

 

Data Frame 接口允许不同的数据源在 Spark SQL 上工作。
Spark SQL 包括具有行业标准 JDBC 和 ODBC 连接的服务器模式。
联合查询Presto 支持联合查询。Presto 可以配置为连接不同的 DB,并且一旦配置;它的 CLI 可用于启动“联合查询”。
在一个 Presto 查询中,用户可以组合来自多个数据源的数据并运行查询。
Spark SQL 带有一个内置功能,可以使用 JDBC 连接其他数据库,即“JDBC 到其他数据库”,它有助于联邦功能。
Spark SQL 带有一个内置功能,可以使用 JDBC 连接其他数据库,即“JDBC 到其他数据库”,它有助于联邦功能。
谁使用?数据分析师、数据工程师、数据科学家等数据分析师、数据工程师、数据科学家、Spark 开发人员等

三、SparkSQL/PrestoSQL 语法差异

idSpark SQLPresto SQL差异
1date_add(start_date, num_days)date_add(unit, value, timestamp) 
unit = second,minute,hour,day,week,month,quarter,year
1)函数入参不一样
2datediff(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)函数入参顺序不一样,相反
31.current_date获取当前日期   2018-04-09
2.current_timestamp/now()获取当前时间 2018-04-09 15:20:49.247
current_date
current_time 
current_timestamp

41.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)

5to_date/date将字符串转化为日期格式,to_timestamp(Since: 2.2.0)

6add_months返回日期后n个月后的日期
SELECT add_months('2016-08-31', 1);   2016-09-30


7last_day(date),next_day(start_date, day_of_week)
SELECT last_day('2009-01-12');  2009-01-31


8trunc截取某部分的日期
第二个参数 ["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
函数参数不一样
9SELECT date_format('2016-04-08', 'y'); 

10nvl(xxxx,'')coalesce(xxx,'')函数名不一样
11select get_json_object(json_str, '$.name');json_extract_scalar(json_str, '$.name')get单层json 
函数名不一样
12get_json_object(json_str, '$.item.tabid');json_extract_scalar(json_str, '$.item.tabid')get多层json 
函数名不一样
13get_json_object(json_str, '$.item.uss_rule[0]');json_extract(json_str, '$.item.uss_rule[0]')get json数组 
函数名不一样
14msg['isBackgroundMode']element_at(msg,'isBackgroundMode')hashmap元素的引用 
 语法格式不一样
15select 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

相关文章