Databend 集成 PRQL:现代数据处理的一小步

PRQL,读作 "Prequel",是一种与 SQL 并肩的查询语言,它的独到之处在于采用了管道式的语法,在查询关系数据库时显得更加直观和高效。

Databend 拥抱 PRQL

v1.2.380-nightly 版本中,得益于社区贡献者 @ncuwaln 提交的重要 PR,Databend 成功地引入了对 PRQL 语言的支持。这一新特性进一步增强了 Databend 查询的灵活性和用户友好性。

用户仅需进行简单的配置更改,即可启用 PRQL 方言:

ini 复制代码
set sql_dialect = 'prql';

集成细节

Databend 和 PRQL 都采用了 Rust 语言进行开发,这使得集成 PRQL 编译器 prqlc 成为可能。

ini 复制代码
prqlc = "0.11.3"

PR 以不到一百行代码实现了对 PRQL 的支持,核心是添加了一个新的 SQL 方言选项 prql

启用此选项后,Databend 将调用 prqlc 解析 PRQL 语句,并将其转换为 SQL 语句,随后由 Databend 的 SQL 解析器进一步处理。

ini 复制代码
 let final_sql: String = match sql_dialect == Dialect::PRQL {
            true => {
                let options = prqlc::Options::default();
                match prqlc::compile(sql, &options) {
                    Ok(res) => {
                        prql_converted = true;
                        res
                    }
                    Err(e) => {
                        warn!(
                            "Try convert prql to sql failed, still use raw sql to parse. error: {}",
                            e.to_string()
                        );
                        sql.to_string()
                    }
                }
            }
            false => sql.to_string(),
        };
 ....

值得一提的是,prqlc 使用了 chumsky 库作为其解析器,而 Databend 则采用了 nom-rule 。尽管两者在技术实现上有所不同,但都提供了用户友好的 errror recovery 信息。

错误提示的对比展示

以下是 PRQL 解析器和 Databend 解析器的错误提示示例:

PRQL 解析器 错误提示:

ini 复制代码
from tracks
select {album_id, name, unit_price}
sort {-unit_price, name}
grouq album_id (
    aggregate {
    track_count = count name,
    album_price = sum unit_price
    }
)

Error: 
   ╭─[:4:1]
   │
 4 │ grouq album_id (
   │ ──┬──  
   │   ╰──── Unknown name `grouq`
───╯

Databend 解析器 错误提示:

vbnet 复制代码
🐳 :) SELECT
  album_id,
  COUNT(*) AS track_count,
  COALESCE(SUM(unit_price), 0) AS album_price
FROM
  tracks
GROUP BX
  album_id;
error: APIError: ResponseError with 1005: error:
  --> SQL:7:7
  |
1 | SELECT
  | ------ while parsing `SELECT ...`
  .
4 |   COALESCE(SUM(unit_price), 0) AS album_price
5 | FROM
6 |   tracks
7 | GROUP BX
  |       ^^ unexpected `BX`, expecting `BY`

如何使用 PRQL

用户只需进行简单的配置,即可切换到 PRQL 方言,并开始享受 PRQL 直观、管道式的查询体验。以下是一个简单的查询示例:

ini 复制代码
🐳 :) set sql_dialect = 'prql';

🐳 :) from lineitem ## run tpch q1
filter `l_shipdate` <= '1998-09-02'
group {l_returnflag, l_linestatus} (
 aggregate {
    sum_qty = sum l_quantity,
    sum_base_price = sum l_extendedprice,
    sum_disc_price = sum l_extendedprice * (1 - l_discount),
    sum_charge = sum l_extendedprice * (1 - l_discount) * (1 + l_tax),
    avg_qty = average l_quantity,
    avg_price = average l_extendedprice,
    avg_disc = average l_discount,
    count_order = count 0 ,
  }
);

通过这个例子,我们可以看到 PRQL 强大的功能和优雅的语法设计,它让复杂的数据查询变得简单而直观。当然,用户也可以随时根据需要切换回标准的 SQL 方言或其他支持的方言:

ini 复制代码
🐳 :) set sql_dialect = 'postgresql';

通过这次集成,Databend 拥抱了前沿的查询语言PRQL,为用户带来了更高效、愉悦的数据处理体验。

相关推荐
IvorySQL3 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl4 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦5 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈7 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客7 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q8 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL9 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃10 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo809710 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat10 小时前
MySQL回表机制解析与优化策略
数据库·sql