目录
概念
Presto(或PrestoDB)
Presto是一个开源的分布式SQL查询引擎,设计初衷是为了快速分析任何规模的数据。其基于内存运算,减少不必要的硬盘IO,并采用Master-Slave架构,Presto自带的监控功能可以查看执行的完整SQL。Presto在内存管理、查询优化、并发处理、数据源支持和社区支持等方面有显著优势。
优势
-
内存管理:Presto使用内存管理技术来减少GC的开销,从而提高性能。Presto使用的内存管理技术是基于内存池的,可以更好地管理内存的分配和释放。
-
查询优化:Presto使用了一系列的查询优化技术,如谓词下推、列裁剪、分区裁剪等,可以减少数据的传输和处理,从而提高查询性能。
-
并发处理:Presto使用了多线程和协程技术来实现并发处理,可以更好地利用CPU资源,提高查询性能。
-
数据源支持:Presto支持多种数据源,包括Hadoop、Cassandra、MySQL、PostgreSQL等,可以更好地满足不同的数据处理需求。
-
社区支持:Presto有一个活跃的社区,不断地更新和维护代码,修复bug和增加新功能,保证了Presto的稳定性和可靠性。
总的来说,Presto在内存管理、查询优化、并发处理、数据源支持和社区支持等方面都有优势
Hive和Presto的语法(SQL)对比
NOT操作
- Hive
SELECT !(rank2_home_days1 >= 2 AND rank2_home_num1 >= 3);
- Presto
SELECT NOT(rank2_home_days1 >= 2 AND rank2_home_num1 >= 3);
JSON解析
- Hive
SELECT get_json_object(json, '$.book');
- Presto
SELECT json_extract_scalar(json, '$.book');
日期加法
- Hive
SELECT date_add('2020-07-24 11:42:58', 1);
- Presto
SELECT date_add('day', 1, CAST('2020-07-24 11:42:58' AS TIMESTAMP));
时间处理
- Hive
SELECT to_date(from_unixtime(UNIX_TIMESTAMP('20200110', 'yyyyMMdd')));
- Presto
SELECT format_datetime(date_parse('20200110', '%Y%m%d'), 'yyyy-MM-dd');
获取数组长度
- Hive
SELECT size(split(user_ids, ',')) FROM test_tb;
- Presto
SELECT cardinality(split(user_ids, ',')) FROM test_tb;
Lateral View / Cross Join
- Hive
SELECT student, score FROM tests LATERAL VIEW explode(split(scores, ',')) t AS score;
- Presto
SELECT student, score FROM tests CROSS JOIN UNNEST(split(scores, ',')) AS t (score);
String数据类型
- Presto
SELECT CAST(1 AS VARCHAR);
Mod运算符
- Presto
SELECT MOD(1, 2); -- 不支持 `1 % 2`
正则表达式
- Presto
SELECT regexp_like(map['field'], '.*');
数组定义
- Presto
SELECT ARRAY [1, 2];
日期差异
- Hive
SELECT datediff('2018-09-07', '2018-09-05');
- Presto
SELECT date_diff('day', CAST('2018-09-05' AS DATE), CAST('2018-09-07' AS DATE));
数据类型转换
- Hive
SELECT CAST('2022-01-01' AS DATE);
- Presto
SELECT DATE '2022-01-01';
presto比spark执行更快的原因
通常情况下,很难断言Presto一定比Spark SQL更快或更慢,这实际上取决于查询类型、环境和引擎调整参数。在数据量不超过限制且逻辑简单的情况下,Presto的性能更优。
Presto的架构相对简单,采用主从式架构,主节点(Coordinator)负责SQL的优化和执行计划分配,同时负责整个集群的内存管理。一个Coordinator可以执行SQL解析、计划、调度以及一组执行物理计划的工作者(Worker)。如果一个查询需要消耗100GB的内存,这超过了整个集群的内存,那么Presto的Coordinator会直接卡掉这个查询,防止内存溢出。
相对而言,Spark在核心之间有更多层次,集群中的每个计算节点的Executor进程中进行内存管理。因此,在特定条件下,Presto能表现出更快的执行速度。