查询引擎的工作原理


查询引擎是一种软件,可以对数据执行查询以生成问题的答案,例如:

  • 今年到目前为止,我每月的平均销售额是多少?
  • 过去一天我网站上最受欢迎的五个网页是什么?
  • 网络流量与上一年相比如何逐月比较?

最广泛使用的查询语言是结构化查询语言(简称SQL)。许多开发人员在其职业生涯的某个阶段会遇到关系数据库,例如 MySQL、Postgres、Oracle 或 SQL Server。所有这些数据库都包含支持 SQL 的查询引擎。

SQL 功能强大且被广泛理解,但在所谓的“大数据”领域有局限性,数据科学家通常需要将自定义代码与他们的查询混合在一起。Apache Hadoop、Apache Hive 和 Apache Spark 等平台和工具现在被广泛用于查询和操作海量数据。

下面的示例演示了如何使用 Apache Spark 对 Parquet 数据集执行简单的聚合查询。Spark 的真正强大之处在于,此查询可以在笔记本电脑或数百台服务器的集群上运行,而无需更改代码。

使用 DataFrame 的 Apache Spark 查询示例


val spark: SparkSession = SparkSession.builder
  .appName("Example")
  .master(
"local<li>")
  .getOrCreate()

val df = spark.read.parquet(
"/mnt/nyctaxi/parquet")
  .groupBy(
"passenger_count")
  .sum(
"fare_amount")
  .orderBy(
"passenger_count")

df.show()

为什么查询引擎流行?
数据正在以越来越快的速度增长,通常无法放在一台计算机上。需要专业的工程技能来编写用于查询数据的分布式代码,并且每次需要从数据中获得新答案时编写自定义代码是不切实际的。
查询引擎提供了一组标准操作和转换,最终用户可以通过简单的查询语言或应用程序编程接口以不同的方式组合这些操作和转换,并针对良好的性能进行了调整。

本书涵盖的内容
本书概述了构建通用查询引擎所涉及的每个步骤。

本书中讨论的查询引擎是专门为本书开发的简单查询引擎,在编写本书内容的同时开发代码,以确保我可以在面临设计决策时编写主题。

源代码
本书中讨论的查询引擎的完整源代码位于以下 GitHub 存储库中。

https://github.com/andygrove/how-query-engines-work
有关使用 Gradle 构建项目的最新说明,请参阅项目中的自述文件。

为什么选择kotlin?
本书的重点是查询引擎设计,它通常与编程语言无关。本书选择 Kotlin 是因为它简洁易懂。它还与 Java 100% 兼容,这意味着您可以从 Java 和其他基于 Java 的语言(例如 Scala)调用 Kotlin 代码。

但是,Apache Arrow 项目中的 DataFusion 查询引擎也主要基于本书的设计。对Rust比JVM更感兴趣的读者可以结合本书参考DataFusion源码。

我对查询引擎的兴趣最终导致我参与了 Apache Arrow 项目,我在 2018 年捐赠了最初的 Rust 实现,然后在 2019 年捐赠了 DataFusion 内存中查询引擎,最后在 2021 年捐赠了 Ballista 分布式计算项目. 我不打算在 Arrow 项目之外构建任何其他项目,现在我将继续为 Arrow 内的这些项目做出贡献。

Arrow 项目现在有许多活跃的提交者和贡献者致力于 Rust 的实现,与我最初的贡献相比,它有了显着的改进。
尽管 Rust 是高性能查询引擎的绝佳选择,但它并不是教授查询引擎相关概念的理想选择,因此我最近在撰写本书时构建了一个用 Kotlin 实现的新查询引擎。Kotlin 是一种非常简洁且易于阅读的语言,这使得在本书中包含源代码示例成为可能。我鼓励您在阅读本书的过程中熟悉源代码,并考虑做出一些贡献。没有比获得一些实践经验更好的学习方法了!

本书的更新将在可用时免费提供

详细点击标题