数据源
本章讨论的源代码可以在 KQuery 项目的 datasource 模块中找到。
如果无法从数据源读取数据,查询引擎就没有什么用处,我们希望能够支持多个数据源,所以创建一个查询引擎与数据源交互的接口是很重要的。这也允许用户将查询引擎用于自定义数据源。数据源通常是文件或数据库,但也可能是内存对象。
数据源接口
在构建查询计划时,了解数据源的表结构是很重要的,这样可以验证查询计划,以确保引用的列存在,并且数据类型与作用于它们的表达式兼容。在某些情况下,表结构可能不可用,因为有些数据源没有固定的表结构,通常被称为 “无表结构”。JSON文档就是无表结构数据源的一个例子。
在查询执行过程中,我们需要从数据源中获取数据的能力,并且需要能够指定哪些列要加载到内存中以提高效率。如果查询没有引用这些列,那么将其加载到内存中是没有意义的。
KQuery DataSource 接口
interface DataSource {
/** Return the schema for the underlying data source */
fun schema(): Schema
/** Scan the data source, selecting the specified columns */
fun scan(projection: List<String>): Sequence<RecordBatch>
}
数据源示例
在数据科学或分析中经常会遇到一些数据源。
逗号分隔值 (CSV)
CSV 文件是文本文件,每行有一条记录,字段用逗号分隔,因此被称为 "逗号分隔值"。CSV 文件不包含表结构信息(除了文件中第一行的可选列名),尽管有可能通过先读取文件来获得表结构。这可能是一个昂贵的操作。
JSON
JavaScript Object Notation 格式(JSON)是另一种流行的基于文本的文件格式。与 CSV 文件不同,JSON 文件是结构化的,可以存储复杂的嵌套数据类型。
Parquet
Parquet 是为提供一种压缩的、高效的列式数据表示而创建的,是 Hadoop 生态系统中一种流行的文件格式。Parquet 从一开始就考虑到复杂的嵌套数据结构,并使用 Dremel 论文中描述的 记录粉碎和组装算法。
Parquet 文件包含表结构信息,数据被存储在批次中(称为“行组”),每个批次由列组成。行组可以包含压缩的数据,也可以包含可选的元数据,如每一列的最小值和最大值。优化后的查询引擎可以使用这些元数据来决定在扫描过程中何时可以跳过行组。
Orc
优化行列(Orc)格式与 Parquet 类似。数据被存储在称为“条纹”的列式批次中。
本书的电子版、MOBI和PDF格式也可从 https://leanpub.com/how-query-engines-work 购买。
Copyright © 2020-2022 Grove Enterprises, LLC。保留所有权利。