【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

PartiQL:一种用于所有数据的查询语言

  • 2019-08-09
  • 本文字数:5518 字

    阅读完需:约 18 分钟

PartiQL:一种用于所有数据的查询语言

数据正以前所未有的速度被收集和创造,但组织中不到一半的结构化数据被积极用于决策。问题的根源在于,有些数据可能是高度结构化的,并存储在 SQL 数据库或数据仓库中。其他数据可能存储在 NoSQL 引擎中,包括键值存储、图形数据库、分类帐数据库或时间序列数据库。

正文

数据正以前所未有的速度被收集和创造。这些数据大多旨在推动业务结果,但根据《哈佛商业评论》报道:“……平均而言,组织中不到一半的结构化数据被积极用于决策……”


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


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



PartiQL 开源使开发人员可以很容易地在自己的应用程序中解析和嵌入 PartiQL。该实现支持用户将 PartiQL 查询解析为抽象语法树,应用程序可以分析或处理这些抽象语法树,它也支持直接解释 PartiQL 查询。


PartiQL 解决了我们在 Amazon 中遇到的问题。它已经应用于 Amazon S3 Select、Amazon Glacier Select、Amazon Redshift Spectrum、Amazon Quantum Ledger Database(Amazon QLDB)和亚马逊的内部系统。同时,Amazon EMR将 PartiQL S3 查询下推到 S3 Select。更多的 AWS 服务将在未来几个月增加支持。在亚马逊之外,Couchbase 也期待着在Couchbase Server中支持 PartiQL 服务器。


我们期待数据处理引擎的创建者深入 PartiQL,并加入我们一起解决一个影响到所有用户数据、所有行业的问题。

我们为什么构建它

我们开发 PartiQL 是源于 Amazon 自己需要查询和转换大量多样化数据的需求——不仅仅是 SQL 表格数据,还有嵌套和半结构化数据——这些数据以各种格式存储在各种存储引擎中。亚马逊的零售业务已经有了巨大的半结构化数据集,通常以lon格式存储。亚马逊的零售业务,由 Chris Suver 负责,希望有一种类似于 SQL 的查询语言。多个 AWS 服务,比如QLDB,验证了模式可选的面向文档的数据模型所带来的好处,但也想利用现有的 SQL 知识和工具。最后,AWS 关系型数据库服务,比如Redshift,以及许多现有的 SQL 客户端,都需要扩展为可以访问数据湖中的非关系型数据,同时与 SQL 保持严格的向后兼容性。同时,数据库研究社区(使用类似 UCSD SQL++查询语言)显示,可以设计出简洁、有充分依据且非常接近 SQL 的查询语言,同时还具有处理嵌套和半结构化数据所需的能力。


Don Chamberlin 是 SQL 语言规范的创建者,他说:“随着 JSON 和其他嵌套和半结构化数据格式的重要性日益增加,对于面向这些数据格式的查询语言的需求变得越来越清晰。将 SQL 用于这个目的的好处在于可以利用行业在 SQL 技能、工具和基础设施上的投资。Yannis Papakonstantinou 博士的 SQL++提案,以及基于 SQL 的语言 PartiQL,表明查询半结构式数据所需的 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 SQL 兼容 JSON,但是未将嵌套的 JSON 数据作为一等公民。半结构化查询语言将嵌套数据作为一等公民,但允许偶尔不兼容 SQL,或者甚至不像 SQL。PartiQL 是解决这一整套原则的第一种语言。


从它的设计原则就可以预料到,对于 SQL 用户而言,PartiQL 简单而熟悉。自 2018 年以来,它已经被 Amazon Redshift Spectrum 的多个客户使用:


Annalect是 Omnicom 的全球数据和分析部门,提供专门的、可扩展的解决方案,使数据可操作,它是 Omnicom 革命性精准营销和见解平台 Omni 背后的驱动力。“PartiQL 让我们能够利用 Amazon Redshift Spectrum 直接在 Amazon S3 中查询嵌套数据而不必展开(un-nesting),也将使我们能够使用标准化语言轻松地把嵌套数据从 Amazon S3 转移到 Amazon Redshift 本地表中,”Annalect 高级工程师和架构师 Eric Kamm 说。John Briscoe 是 Annalect 的数据和业务主管,他补充道:“我们也很兴奋,它将为我们提供跨数据平台一致的查询语法,让我们更容易开发多数据平台应用程序和进行新员工开发培训”。


Yelp软件工程师 Steven Moy 说:“PartiQL 弥补了多存储环境中缺失的关键部分——一种可以跨多个领域特定的数据存储的高级声明式语言。在 Yelp,我们利用多种 AWS 数据存储(Redshift、S3、DynamoDB)技术将本地最好的企业提供给用户,并使本地企业主能以最好的方式找到本地受众。借助 Amazon Redshift Spectrum,Yelp 能够使用八倍的数据量来帮助我们的开发者社区根据数据做出决定,我们期待借助 PartiQL 使这种伙伴关系更进一步,让 Yelp 的开发者把时间集中在创造愉快的用户体验上,而不是掌握一种新的查询语言或解决传统的一致性问题。”


与传统的 SQL 不同,PartiQL 查询语言也满足 NoSQL 和非关系型数据库的需要。PartiQL 已经被Amazon Quantum Ledger Database(QLDB)采用作为查询语言。


Andrew Certain 是 AWS 高级首席工程师兼Amazon Quantum Ledger Database(QLDB)架构师,关于选择 PartiQL,他说:“QLDB 需要一种灵活的、面向文档的数据模型,这样用户可以很容易地存储和处理结构化和半结构化数据,而没有定义和改进模式的负担。与此同时,QLDB 希望从 SQL 广博的知识中获益。PartiQL 很好地满足了这两个目的。它用于访问嵌套和半结构化数据的扩展很少,但很强大,也非常直观。”QLDB 目前尚处于预览模式,它是采用 PartiQL 的 AWS 服务之一。


Couchbase Server利用基于 JSON 的、面向文档的数据模型,它也希望采用 PartiQL:


Ravi Mayuram Couchbase的高级工程副总裁兼首席技术官,他说:“三年多前推出 N1QL 时,他们是将 SQL 带给 JSON 的先锋,Couchbase 认为,面向关系数据库的 SQL 赖以创建的基础同样适用于 JSON 数据模型和数据库。在这种融合中,PartiQL 迈出了令人愉快的下一步,我们期待对它的支持。”

PartiQL 参考引擎


这张图表从一个非常高的层面上展示了 PartiQL 的参考实现。我们开源了 PartiQL 查询表达式的词法分析程序、解析器和编译器。我们提供了一个库,可以嵌入或作为独立的工具用于运行查询。用户可以使用这个库简单地验证 PartiQL 查询,或者在他们的系统中嵌入 PartiQL 求值器用于处理数据。这个库提供了一个数据接口,可以绑定到应用程序中可能存在的任何数据后端,并对 Ion 和 JSON 提供了开箱即用的支持。

准备开始

PartiQL 开源实现提供了一个交互式 shell(或 Read Evaluate Print Loop ,缩写为 REPL),允许用户编写 PartiQL 查询并对其求值。

前提条件

PartiQL 需要你在机器上安装 Java 运行时(JVM)。你可以从OpenJDKOpenJDK for WindowsOracle获得 Java 运行时的最新版本。


按照说明安装JDK软件并将JAVA_HOME设置为Java运行时的安装路径

下载 PartiQL REPL

PartiQL的每个版本都有一个归档文件,其中包含 PartiQL REPL 的 zip 压缩文件。


你可能需要点击 Assets 来查看 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 包含 pdf 和 html 格式的教程。子文件夹 code 包含三种类型的文件:

  4. 扩展名为.env 的数据文件。这些文件包含我们可以查询的 PartiQL 数据。

  5. 扩展名为.sql 的 PartiQL 查询文件。这些文件包含教程中使用的 PartiQL 查询。

  6. 扩展名为.output 的样例查询输出文件。这些文件包含在适当的数据上运行教程中的查询的样例输出。

运行 PartiQL REPL

在 Windows 上


运行(双击)particl.bat 应该会打开一个命令行提示符,并启动 PartiQL REPL,界面如下:


Welcome to the PartiQL REPL!PartiQL>
复制代码


在 macOS(Mac)和 Unix 上


  1. 打开一个终端,并导航到 partiql-cli 文件夹。该文件夹的名称以 PartiQL 的版本号作为后缀,即 partiql-cli-0.1.0.

  2. 输入./bin/partiql 并回车启动 REPL ,界面如下:


Welcome to the PartiQL REPL!PartiQL>     
复制代码

测试 PartiQL REPL

编写一个简单的查询验证 PartiQL REPL 是否正常。在 PartiQL>后面输入以下查询:


PartiQL> SELECT * FROM [1,2,3]       
复制代码


按两次回车。输出类似下面这个样子:


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 的全局环境中加载了什么数据,即:


Welcome to the 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 请求来为项目做出贡献。如果存在 Bug 或缺少特性,则请提交问题。阅读本教程了解 PartiQL 语法、如何扩展 SQL 和分步演练。想了解 PartiQL 的每个细节吗?请通读规范


英文原文:Announcing PartiQL: One query language for all your data


2019-08-09 09:1711161
用户头像

发布了 693 篇内容, 共 402.2 次阅读, 收获喜欢 1503 次。

关注

评论

发布
暂无评论
发现更多内容

【T1543.003】利用 ACL 隐藏恶意 Windows 服务

比伯

Java 大数据 编程 架构 计算机

从零到千万用户,我是如何一步步优化MySQL数据库的?

冰河

数据库 架构 性能优化 分布式数据库 分布式存储

O'Reilly出版社又一经典之作——Python设计模式

计算机与AI

Python

简要分析近几年商业软件开发平台的现状

Philips

敏捷开发 快速开发 企业应用

阿里云视频云实时字幕技术,助力英雄联盟S10全球总决赛

阿里云视频云

游戏开发 直播 语音识别 字幕

【算法题目解析】杨氏矩阵数字查找

程序员架构进阶

算法 二分查找 杨氏矩阵

Java程序员必备,Github上星标55.9k的微服务神级笔记简直太香了,学完感觉自己又行了!

Java架构之路

Java 程序员 架构 面试 编程语言

涨薪神作!华为内部操作系统与网络协议笔记爆火,Java程序员有福了

Java架构之路

Java 程序员 面试 编程语言

cglib入门后篇

Rayjun

Java cglib

Pulsar Summit Asia 2020 中文专场议题出炉!

Apache Pulsar

大数据 开源 Apache Pulsar

从一场“众盟科技云滇之播”,我们发现了美食直播的商业与公益价值

人称T客

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,使用数组,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

非线性声学回声如何破解?华为云硬核技术为你解决

华为云开发者联盟

算法 音视频

马士兵老师首推Java七条自学路线,自学到底能不能行?自学也能拿到40W年薪?

Java架构追梦

Java 架构 面试 马士兵 项目实战

JVM真香系列:轻松掌握JVM运行时数据区

田维常

JVM

甲方日常 47

句子

工作 随笔杂谈 日常

IPFS云算力挖矿系统开发技术

薇電13242772558

区块链 IPFS

可以解除程序员中年危机的职业规划

Java架构师迁哥

5G为数字化转型插上翅膀

CECBC

5G网络安全

「Java并发编程」从源码分析几道必问线程池的面试题?

Java架构师迁哥

记不住Spring中Scheduled中的Cron语法?让我们看看源码吧

AI乔治

Java spring 编程 架构

云计算简史(完整版)

明道云

《迅雷链精品课》第二课:区块链核心技术框架

迅雷链

区块链

Docker

数字人民币都来了 黄金还有什么用?

CECBC

数字货币

区块链产业,怎样“链”住未来?

CECBC

区块链

TCP性能分析与调优策略

程序员 计算机网络 网络协议

当代开发者的六大真实现状,你被哪一个场景“戳中”了?

华为云开发者联盟

开发者 调研 报告

Redis基础—了解Redis是如何做数据持久化的

数据库 redis 编程 计算机

架构师训练营第 1 期第 8 周学习总结

好吃不贵

极客大学架构师训练营

深度解析ThreadLocal原理

AI乔治

Java 架构 线程 ThreadLocal

PartiQL:一种用于所有数据的查询语言_语言 & 开发_Jon Wilsdon_InfoQ精选文章