Presto中的“查询数据所在的位置”是什么意思?
我在 Presto 教程中看到了这个,它说好处是“在它所在的位置查询数据”。
这是什么意思?我很想与传统的 v. Presto 版本进行比较。
编辑:通过链接到主页上的引用来添加上下文
https://prestodb.io/在“它能做什么?”
回答
TL;DR:查询数据所在的位置是一种快速方式,表示您无需将数据从其他数据库移动到一个数据库中即可对所有数据运行查询。换句话说,Presto 可以充当查询多个数据库的枢纽,并使用标准 ANSI SQL 对数据进行进一步处理。
我在上一家公司遇到的一个用例是,我们需要一种标准方法来访问来自 Elasticsearch 集群和数据湖 (Hive/HDFS) 的数据,并将这两个数据源结合起来。唯一的区别是我们使用了 Trino 而不是 Presto,因为Trino 是 Presto 的创建者现在维护的分叉。这些例子仍然适用于两者。
Elasticsearch 将数据存储在Apache Lucene索引中,并且实际上只能通过源自Elasticsearch 查询 DSL 的Elasticsearch 客户端进行访问。
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 流程等......