什么是查询引擎?

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

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

最普遍的查询语言是 结构化查询语言(缩写为 SQL)。许多开发者在其职业生涯的某个阶段都会用到关系型数据库,如 MySQL、Postgres、Oracle 或 SQL Server。所有这些数据库都包含支持 SQL 的查询引擎。

以下是一些SQL查询的例子。

SQL示例:各月平均销售额

SELECT month, AVG(sales) FROM product_sales WHERE year = 2020 GROUP BY month;

SQL实例:昨天的前5个网页

SELECT page_url, COUNT(*) AS num_visits FROM apache_log WHERE event_date = yesterday() GROUP BY page_url ORDER BY num_visits DESC LIMIT 5;

SQL 功能强大且被广泛理解,但在所谓的“大数据”世界中却有局限性,数据科学家往往需要在他们的查询中混入自定义代码。Apache Hadoop、Apache Hive 和 Apache Spark 等平台和工具现在被广泛用于查询和处理庞大的数据量。

这里有一个例子,演示了如何使用 Apache Spark 来对 Parquet 数据集进行简单的聚合查询。Spark 的真正威力在于,这个查询可以在一台笔记本电脑上运行,也可以在一个由数百台服务器组成的集群上运行,中间不需要修改代码。

使用数据帧进行 Apache Spark 查询的示例:

val spark: SparkSession = SparkSession.builder .appName("Example") .master("local[*]") .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

请参考项目中的README,了解使用 Gradle 构建本项目的最新说明。

为什么用Kotlin?

本书主要关注查询引擎的设计,这通常是与编程语言无关的。我为本书选择了 Kotlin 是因为它简明扼要而且易于理解。它还与 Java 100%兼容,这意味着你可以从 Java 以及其他基于 Java 的语言(如 Scala)调用 Kotlin 代码。

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

本书的电子版、MOBI和PDF格式也可从 https://leanpub.com/how-query-engines-work 购买。

Copyright © 2020-2022 Grove Enterprises, LLC。保留所有权利。