首页 > 解决方案 > Presto 中的“查询数据所在的位置”是什么意思?

问题描述

我在 Presto 教程上看到了这一点,它说好处是“查询数据所在的位置”。

这是什么意思?我喜欢与传统的 v. Presto 版本的事物进行比较。

编辑:通过链接到主页上的报价添加上下文

https://prestodb.io/在“它能做什么?”

标签: prestotrino

解决方案


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 流程等......


推荐阅读