亚马逊AWS官方博客

推出 PartiQL:适合所有数据的一种查询语言

如今,收集和创建数据的速度已达到前所未有的水平。这些数据的目的大多在于推动业务成果,但据哈佛商业评论称,“…平均来看,组织中只有不到一半的结构化数据被积极用于决策…”

问题的根源在于,数据通常分布于关系数据库、非关系数据存储和数据湖的组合中。一些数据可能被高度结构化并存储在 SQL 数据库或数据仓库中。另一些数据可能存储在 NoSQL 引擎中,包括键值存储、图形数据库、分类账数据库或时间序列数据库中。数据还可能驻留在数据湖中,以可能缺乏架构的格式存储,或者可能涉及嵌套或多个值(例如 Parquet、JSON)。每种不同类型和风格的数据存储可能适合某个特定的使用按钮,但每种数据存储也都具有自己的查询语言。产生的结果是,查询语言与存储数据的格式紧密耦合。因此,如果您要将数据更改为另一种格式,或者要将使用的数据库引擎更改为访问/处理该数据(这在数据湖领域中并不罕见),或更改数据的位置,您可能还需要更改您的应用程序和查询。这极大的阻碍了有效使用数据湖所需的敏捷性和灵活性。

今天,我们很高兴地推出 PartiQL,它是一种兼容 SQL 的查询语言,可用于轻松高效地查询数据,无论数据存储的位置或格式如何。只要您的查询引擎支持 PartiQL,您就可以处理关系数据库(包括事务数据库和分析数据库)中的结构化数据、开源数据格式的半结构化和嵌套数据(如 Amazon S3 数据湖),甚至于 NoSQL 或文档数据库中允许对不同行使用不同属性的无架构数据。我们在 Apache2.0 许可证下对语言的 PartiQL 教程规范参考实现进行开源,这样每个人都可以参与、贡献和使用它来推动这种统一查询语言的广泛采用。

 

显示 PartiQL 与其他数据源匹配位置的图表。

 

PartiQL 开源将使开发人员能够轻松解析和将 PartiQL 嵌入自己的应用程序中。实现支持用户将 PartiQL 查询解析为其应用程序可分析或处理的抽象语法树,并支持直接解释 PartiQL 查询。

PartiQL 可解决我们在 Amazon 中遇到的问题。它已被 Amazon S3 Select、Amazon Glacier Select、Amazon Redshift Spectrum、Amazon Quantum Ledger Database (Amazon QLDB) 和 Amazon 内部系统所使用。同时,Amazon EMR 还可将 PartiQL 查询下推到 S3 Select 中。未来几个月将推出更多的 AWS 服务,以增加支持。在 Amazon 之外,Couchbase 还期望在 Couchbase Server 中支持 PartiQL。

我们期待数据处理引擎的创建者会深入研究 PartiQL,并与我们一起来解决影响各行业各个数据用户的问题。

我们为什么构建 PartiQL

为了响应 Amazon 自己查询和转换海量多样化数据(不仅仅是 SQL 表格数据,还包括嵌套和半结构化数据,可见于各种格式和存储引擎中)的需求,我们开发了 PartiQL。Amazon 的零售业务已经拥有大量的半结构化数据集,通常以 Ion 格式。 由 Chris Suver 领导的 Amazon 零售业务一直在追求一种类似 SQL 的查询语言。QLDB 等多个 AWS 服务看到了架构可选、面向文档的数据模型所带来的益处,但同时也想利用现有的 SQL 知识和工具。最后,Redshift 等 AWS 关系数据库服务及很多现有的 SQL 客户端需要扩展到访问数据湖的非关系数据,同时维持与 SQL 的严格的后向兼容性。同时,使用 UCSD 的 SQL++ 之类的查询语言的数据库研究社区显示,可以设计出非常接近 SQL 的干净、基础良好的查询语言,同时拥有处理嵌套和半结构化数据所需的能力。

SQL 语言规范的创造者 Don Chamberlin说:“随着 JSON 和其他嵌套和半结构化数据格式的重要性提高,这些数据格式对查询语言的需求越来越明显。为此目的调整 SQL 的方法具有的优势在于,它基于行业对 SQL 技能、工具和基础设施的投资。Yannis Papakonstantinou 博士的 SQL++ 提议及基于 PartiQL 等 SQL++ 的语言显示,查询半结构化数据所需的 SQL 扩展相当低。我希望这些小的语言扩展将有助于促进开发新一代应用程序,这些应用程序无论有无预定义架构,都将能够处理 JSON 和其他灵活格式的数据。”

因此,我们开始创建一种语言,它将提供严格的 SQL 兼容性、以最低扩展实现嵌套和半结构化处理、将嵌套数据视为视为一类需求、允许可选架构,并且独立于物理格式和数据存储。

结果便是 PartiQL,它提供一种简单且一致的方法来查询各种不同格式和服务的数据。这样一来,您可以在各个数据源间自由移动数据,无需更改您的查询。它与 SQL 反向兼容,为多值数据、嵌套数据和无架构数据提供扩展,从而与标准 SQL 的加入、过滤和聚合功能无缝结合在一起。

PartiQL 设计原则

以下设计原则体现了我们的设计目标,是 PartiQL 的基础:

  • SQL 兼容性:PartiQL 通过维持与 SQL 的兼容性来促进采用。现有 SQL 查询在为了提供 PartiQL 而扩展的 SQL 查询处理器中继续起作用(即它们将维持自己的语法和语义)。如此一来,便避免了重写现有 SQL 的需求,并且使开发人员和商业智能功能可轻松利用 PartiQL。
  • 一类嵌套数据:该数据模型将嵌套数据视为数据抽象的基础部分。因此,PartiQL 查询语言提供可全面准确地访问和查询嵌套数据的语法和语义,同时与 SQL 的标准功能自然的组合到一起。
  • 可选架构和查询稳定性:PartiQL 不需要在数据集上使用预定义架构。按设计,它可被担任有架构引擎(无论是写入时的架构还是读取时的架构)或无架构引擎的数据库引擎使用。从技术上来看,只要数据本身保持不变,正在进行的查询就不会因现有数据被应用架构而改变。因此,尽管参与引擎的架构假设不同,仍然更容易提供对多个存储的一致性访问。
  • 最小扩展:PartiQL 在 SQL 上有最少数量的扩展。这些扩展易于理解、有助于高效实现,并且彼此之间及与 SQL 本身都能很好的结合。它支持对结构化、半结构化和嵌套数据集的组合进行直观筛选、加入、聚合和窗口化。
  • 格式的独立性:PartiQL 语法和语义不受任何特定数据格式的限制。在 JSON、Parquet、ORC、CSV、Ion 或其他格式的基础数据中,查询均以相同方式编写。查询在映射到不同基础格式的综合逻辑型系统中运行。
  • 数据存储的独立性:PartiQL 语法和语义不受任何特定基础数据存储的限制。由于其表达性,语言适用于各种不同的基础数据存储。

过去的语言已经解决了这些原则的子集。例如,Postgres JSON 与 SQL 兼容,但没有将 JSON 嵌套数据视为一类需求。半结构化查询语言虽然将嵌套数据视为一类需求,但它允许偶尔与 SQL 不兼容,或者甚至看起来不像 SQL。PartiQL 是第一个遵守这一整套原则的语言。

正如它的设计原则带给您的期望结果一样,PartiQL 对于 SQL 用户来说既简单又熟悉。自 2018 年以来,它已被 Amazon Redshift Spectrum 的多位客户使用:

Annalect 是 Omnicom 的全球数据与分析小组,它提供使数据可操作的特定用途可扩展解决方案,是 Omnicom 的革命性精准营销和洞察力平台 Omni 背后的推动力。“PartiQL 使我们能够在 Amazon S3 中使用 Amazon Redshift Spectrum 直接查询嵌套数据,无需进行无嵌套化处理,同时,它还使我们能够使用标准化语言将 Amazon S3 中的嵌套数据带入 Amazon Redshift 的本地表格中”,Annalect 的高级工程师兼架构师 Eric Kamm 说。Annalect 数据和运营部总监 John Briscoe 补充道:“令我们兴奋的还有,它可以让我们在一个数据平台到另一个数据平台中一致地查询语法,从而可以更轻松地开发多数据平台应用程序、更简单地进行开发人员入职培训。”

Yelp 的软件工程师 Steven Moy 说:“PartiQL 解决了多存储环境中的关键缺失部分 — 可以跨多个域特定数据存储工作的高层次声明性语言。在 Yelp,我们利用多个 AWS 数据存储(Redshift、S3、DynamoDB)技术将最佳的本地业务提供给用户,并为当地企业所有者提供接触当地受众的最佳方式。利用 Amazon Redshift Spectrum,Yelp 支持八倍的数据量,从而帮助开发人员社区根据数据作出明智的决策,并且我们期待能与 PartiQL 进一步合作,从而使 Yelp 的开发人员能将时间集中于创造愉悦的用户体验,而不是掌握一门新的查询语言或解决典型的一致性问题。”

与传统 SQL 不同的是,PartiQL 查询语言同时还满足 NoSQL 和非关系数据库的需求。Amazon Quantum Ledger Database (QLDB) 已采用 PartiQL 作为它们的查询语言。

AWS 高级首席工程师兼 Amazon Quantum Ledger Database (QLDB) 架构师 Andrew Certain 谈到选择 PartiQL 时称:“QLDB 需要一个灵活的、面向文档的数据模式,从而使用户可以轻松存储和处理结构化和半结构化数据,无需承受定义和发展架构的负担。同时,QLDB 希望从广泛的 SQL 知识中获益。PartiQL 极大地满足了这两个目的。它只需极少的扩展便可以访问嵌套和半结构化数据,且这些扩展功能强大且非常直观。” QLDB 目前处于预览模式,是采用了 PartiQL 的 AWS 服务之一。

Couchbase Server 利用的是基于 JSON 的面向文档的数据模型,也期待采用 PartiQL:

Couchbase 的工程高级副总裁兼首席技术官 Ravi Mayuram 说:“作为将 SQL 引入 JSON 的先驱(在三年前引入 N1QL 时),Couchbase 认为为关系数据库构建 SQL 所依据的基础与 JSON 数据模型和数据库同样可靠。PartiQL 是此趋同过程中一个可喜的进步,我们期待为它提供支持。”

PartiQL 参考引擎

PartiQL 参考实现架构。

此图表在较高的级别上显示了 PartiQL 参考实现。我们对 PartiQL 查询表达式的词句分析器、解析器和编译器进行了开源。我们提供了一个可嵌入或用作独立工具以运行查询的库。用户可以使用这个库来验证 PartiQL 查询,或嵌入 PartiQL 评估器以在其系统内处理数据。该库提供数据接口以绑定到应用程序可能具有的任何数据后端,并为 Ion 和 JSON 提供开箱即用的支持。

入门

PartiQL 开源实现提供交互式 shell(或 Read Evaluate Print Loop (REPL)),可使用户写入和评估 PartiQL 查询。

先决条件

PartiQL 需要在您的机器上安装 Java Runtime (JVM)。您可以从 OpenJDKOpenJDK for WindowsOracle 中获取最新版本的 Java Runtime。

遵照安装 JDK 软件并将 JAVA_HOME 设置到您的 Java Runtime 安装所在路径的说明。

下载 PartiQL REPL

每个 PartiQL 版本都随附一个存档,其中包含压缩文件格式的 PartiQL REPL。

您可能必须要点击资产才能查看 zip 和 tgz 存档。下载最新的 partiql-cli zip 存档到您的机器中。该文件会将 PartiQL 的发行版本附加到存档中,即 partiql-cli-0.1.0.zip。

在您的机器上扩展(解压缩)存档,以生成以下文件夹结构(其中 ... 代表省略的文件/目录):

├── partiql-cli
    ├── bin
    │   ├── partiql
    │   └── partiql.bat
    ├── lib
    │   └── ...
    ├── README.md
    └── Tutorial
        ├── code
        │   └── ...
        ├── tutorial.html
        └── tutorial.pdf

根文件夹 partiql-cli 包含 README.md 文件和三个子文件夹:

  1. bin 包含启动脚本:partiql 适用于 macOS 和 Unix 系统,partiql.bat 适用于 Windows 系统。执行这些文件以启动 REPL。
  2. lib 包含运行 PartiQL 所需的所有必要的 Java 库。
  3. Tutorial 包含 pdfhtml 形式的教程。子文件夹 code 包含三种类型的文件:
    1. 扩展名为 .env 的数据文件。这些文件包含可供我们查询的 PartiQL 数据。
    2. 扩展名为 .sql 的 PartiQL 查询文件。这些文件包含教程中使用的 PartiQL 查询。
    3. 扩展名为 .output 的示例查询输出文件。这些文件包含在适当数据上运行教程查询所生成的示例输出。

运行 PartiQL REPL

Windows

运行(双击)particl.bat。此操作应该会打开命令行提示符并且会启动 PartiQL REPL,屏幕将显示:

欢迎使用 PartiQL REPL!
PartiQL>

macOS (Mac) 和 Unix

  1. 打开终端并导航至 partiql-cli 文件夹。文件夹名称将以 PartiQL 版本作为后缀,即 partiql-cli-0.1.0
  2. 键入 ./bin/partiql 并按下 ENTER 以启动 REPL,屏幕将显示:
欢迎使用 PartiQL REPL!
PartiQL>

测试 PartiQL REPL

写入简单的查询以验证您的 PartiQL REPL 是否在运行。在 PartiQL> 提示符类型:

PartiQL> SELECT * FROM [1,2,3]

ENTER 按两次。输出应与以下内容类似:

PartiQL> SELECT * FROM [1,2,3]
   | 
===' 
<<
  {
    '_1': 1
  },
  {
    '_1': 2
  },
  {
    '_1': 3
  }
>>
--- 
OK! (86 ms)
PartiQL>?

祝贺您! 您已成功安装并运行 PartiQL REPL。PartiQL REPL 正在等待更多的输入。

要退出 PartiQL REPL,请按:

  • macOS 或 Unix 中的 Control+D
  • Windows 中的 Control+C

或关闭终端/命令提示符窗口。

从文件中加载数据

将所需的数据加载到 REPL 中的一个简单方法是在启动 REPL 时使用 -e 开关及提供包含您数据的文件的名称:

./bin/partiql  -e Tutorial/code/q1.env

然后,您可以使用特殊的 REPL 命令 !global_env 查看加载到 REPL 全球环境中的内容,即,

欢迎使用 PartiQL REPL!
PartiQL> !global_env
   | 
===' 
{
  'hr': {
    'employees': <<
      {
        'id': 3,
        'name': 'Bob Smith',
        'title': NULL
      },
      {
        'id': 4,
        'name': 'Susan Smith',
        'title': 'Dev Mgr'
      },
      {
        'id': 6,
        'name': 'Jane Smith',
        'title': 'Software Eng 2'
      }
    >>
  }
}
--- 
OK! (6 ms)

如何参与 PartiQL

PartiQL 是在 Apache2.0 许可下完全开源的语言。我们欢迎您在进一步扩展规范、构建技术以及提高其在用户社区中的应用和认知度方面做出的贡献。了解关于 PartiQL 的更多信息

您可以通过为 good first issue 发送 Pull 请求来对项目作出贡献。在存在漏洞或缺少功能时提出问题。通读教程以了解 PartiQL 语法、它扩展 SQL 的方法,并逐步进行演练。想要了解 PartiQL 的每个细节? 请通读规范