我在Presto教程中看到了这一点,它说好处是"查询它所在的数据";。
这是什么意思?我喜欢与传统的v.Presto版本进行比较。
编辑:通过链接到主页上的报价添加上下文
https://prestodb.io/在";它能做什么">
TL;DR:查询数据所在的位置是一种快速的方式,表示您不需要将数据从其他数据库移动到一个数据库中,就可以对所有数据进行查询。换句话说,Presto可以充当查询多个数据库的集线器,并使用标准ANSI SQL对数据进行进一步处理。
我在上一家公司遇到的一个用例是,我们需要一种标准的方法来访问Elasticsearch集群和数据湖(Hive/HDFS(中的数据,并将这两个数据源结合起来。唯一的区别是我们使用了Trino而不是Presto,因为Trino是Presto的创建者现在维护的叉子。这两个例子仍然适用。
Elasticsearch将数据存储在Apache Lucene索引中,实际上只能通过Elasticsearch客户端访问,该客户端源自Elasticearch查询DSL。
Hive的数据通常以开放文件格式(ORC、JSON、AVRO或Parquet(存储,并驻留在分布式文件系统中,如HDFS或S3云存储解决方案。您可以通过HiveQL查询它,这有点像SQL,但却是一种特殊的方言。
我们必须编写和维护大量代码来与这两个系统对接,尤其是维护查询每一个系统的模型。维护这些代码并保持两个系统与正确查询每个系统的数据保持一致,会产生无数问题和错误。例如,看看这个Elasticsearch查询与HiveQL的等价查询。
curl -X POST "localhost:9200/my_table/_search?pretty" -H 'Content-Type:application/json' -d'
{
"query": {
"bool" : {
"must" : {
"term" : { "user_id" : "kimchy" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
}
}
}
}
'
HiveQL相当于上面的Elasticsearch查询。
SELECT *
FROM my_table
WHERE user_id = "kimchy" AND NOT (age >= 10 AND age <= 20);
Trino真正强大的地方在于,如果我想在每个系统中获得所有这些数据。我不仅可以只使用SQL访问这两个系统,而且不必在系统之间移动这些数据就可以得到这个系统的答案。我可以运行以下查询。
SELECT *
FROM hive.default.my_table
WHERE user_id = "kimchy" AND NOT (age >= 10 AND age <= 20)
UNION ALL
SELECT *
FROM elasticsearch.default.my_table
WHERE user_id = "kimchy" AND NOT (age >= 10 AND age <= 20);
现在,您可以在两个系统中生成相同的查询,并将输出联合在一起,并且知道Trino在每个版本中都在不断验证所有不同连接器的正确性。这只是Trino解决的用例之一,同时能够替换许多ETL过程等。