您现在的位置是:首页 > 文章详情

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

日期:2024-04-03点击:191

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

Databend 拥抱 PRQL

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

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

set sql_dialect = 'prql'; 

集成细节

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

prqlc = "0.11.3" 

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

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

 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 解析器 错误提示:

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 解析器 错误提示:

🐳 :) 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 直观、管道式的查询体验。以下是一个简单的查询示例:

🐳 :) 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 方言或其他支持的方言:

🐳 :) set sql_dialect = 'postgresql'; 

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

原文链接:https://my.oschina.net/u/5489811/blog/11050687
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章