Spark SQL 与 Presto SQL 对比

一、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差异
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
函数参数不一样
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

### Spark 常用函数 Presto 函数的区别及各自特点 #### 数据处理能力对比 Spark 支持多种数据处理任务,包括批处理、流处理机器学习,具有易于使用的 API 丰富的生态系统[^2]。相比之下,Presto 更专注于交互式查询 BI 类型的任务,在这类场景下表现出更高的效率[^1]。 #### SQL 语法支持程度 Presto 支持的标准 SQL 功能较为有限,尤其对于复杂的 SQL 查询(如嵌套子查询或高级聚合操作),可能会遇到不兼容的情况。然而,这并不意味着 Presto 不具备强大的查询功能;相反,它针对特定应用场景进行了优化,能够快速执行简单到中等复杂度的查询语句。 #### 内置函数库差异 - 在 Spark 中可以使用 `initcap` 将单词首字母大写转换,而在 Presto 则提供了类似的 `upper` 或者 `lower` 来改变整个字符串大小写的函数。 - **日期时间操作** - Spark 提供了诸如 `date_add`, `datediff` 这样的实用工具来进行日期运算; - Presto 同样拥有强大而灵活的时间戳处理方式,比如通过 `from_iso8601_timestamp()` 解析 ISO8601 时间格式,并且可以直接利用标准 SQL 的 `DATE_ADD` 函数实现相同的功能[^3]。 - 双方都实现了完整的窗口函数集,允许用户定义分区、排序以及框架范围内的计算逻辑。不过具体表达形式上会存在细微差别,例如在指定窗口边界时所采用的关键字有所不同。 ```sql -- Spark SQL 窗口函数例子 SELECT id, value, SUM(value) OVER (PARTITION BY category ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as cumulative_sum FROM table_name; -- Presto SQL 窗口函数例子 SELECT id, value, sum(value) over(partition by category order by ts rows between unbounded preceding and current row) AS cumsum FROM mytable; ``` #### 性能考量 当涉及到大规模数据分析时,特别是在分布式环境中运行长时间运行的大规模 ETL 流程或是训练模型的情况下,Spark 显示出了更好的扩展性稳定性。而对于那些更关注实时响应的小批量读取请求,则可能是 Presto 发挥优势的地方。 #### 生态系统集成 由于 Spark 是一个通用的数据处理平台,因此其周边生态更加完善,涵盖了从数据摄取到可视化的各个环节。这意味着开发者可以在同一个平台上完成更多种类的工作负载而不必切换环境。另一方面,虽然 Presto 自身也不断发展壮大着自己的社区支持体系,但在某些领域内仍不及前者成熟。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值