Presto是一款分布式SQL交互式查询引擎,其查询效率比Hive高出5至10倍,支持多种数据源的秒级查询。
Presto采用基于内存的查询方式,这使得它的查询速度更快。除了基于内存,Presto还应用了向量计算、动态编译执行计划优化的ORC和Parquet Reader技术,从而进一步优化查询速度。
Presto和Hive适用于不同的应用场景。尽管Presto查询速度快,但并非适用于所有查询场景。
例如,在进行多张大表的关联查询时,由于Presto需要将数据加载到内存中,如果查询时间超过几分钟,则会影响集群性能。这违背了Presto交互式查询的初衷,即实现接近实时的查询与返回。因此,Presto不适合进行多表关联操作或ETL操作,这种情况下应使用Hive。
此外,Hive只能查询HDFS,而Presto支持MySQL、PostgreSQL、Kafka和Redis等多种数据源。总体而言,Presto是一种多数据源查询的利器。
结合实际业务场景,Presto适用的场景包括:
Presto不应被用作ETL工具或进行多表关联查询,而更适合进行单表查询操作。
Presto的官方文档非常详细,相信结合文档,用户能够快速将Hive SQL转换为Presto SQL。
我们经常需要解析日志,尤其是JSON格式的日志。下面介绍如何使用Presto进行JSON解析。
假设employee表中的xjson字段包含以下JSON数据:
json
[{"name":"王二","sex":"男","age":"25"},{"name":"李四","sex":"男","age":"47"}]
要获取“王二”的年龄,可以使用以下Hive SQL:
sql
select get_json_object(xjson, '$.[0].age') from employee limit 1;
查询结果为:25
使用Presto时,可以使用jsonarrayget()和jsonextract()函数。首先,用jsonarray_get()取出JSON数组的第一个元素:
sql
select json_array_get(xjson, 0) from employee limit 1;
查询结果为:
json
{"name":"王二","sex":"男","age":"25"}
接着,使用json_extract()函数从上述结果中提取“王二”的年龄:
sql
select json_extract('{"name":"王二","sex":"男","age":"25"}', '$.age');
查询结果为:25
Presto提供了解析JSON的函数jsonarrayget()和jsonextract()。对于JSON数组,需要使用jsonarrayget()函数来获取指定位置的元素。而对于JSON对象,可以使用jsonextract()函数进行查询,类似于Hive中的getjsonobject()。