0.0.1 2023年11月21日

#21#dialect

Apache-2.0

27KB
437

joinery:将BigQuery的“标准SQL”方言(某些部分)转换为其他数据库

当前状态: 正在准备一个安静的产品发布,但尚未完成。这是一个目前在 tests/sql/ 中运行的测试的证明概念,但尚未准备好用于其他任何事情。请参阅 ARCHITECTURE.md 以了解代码库的概述。此代码不到两个月,因此我们还有一些重构要做。

这是什么?

这是一个实验性工具,用于将BigQuery的“标准SQL”方言编写的某些SQL代码转换为其他方言。例如,它可以转换

SELECT ARRAY(
    SELECT DISTINCT val / 2
    FROM UNNEST(arr) AS val
    WHERE MOD(val, 2) = 0
) AS arr
FROM array_select_data;

...为Trino兼容的SQL

SELECT ARRAY_DISTINCT(
    TRANSFORM(
        FILTER(arr, val -> MOD(val, 2) = 0),
        val -> val / 2
    )
) AS arr
FROM array_select_data

它甚至执行类型推断,这对于某些复杂转换是必需的!转换过程尽力保留空白和注释,因此输出SQL仍然大部分可读。

当前状态

尽管它具有足够的特性来运行我们生产工作负载的大部分,但这仍然是一个非常在开发中的项目。它在一定程度上支持以下数据库

  • Trino:最佳覆盖。容易在Docker下本地运行。
    • AWS Athena 3:大部分工作正常,但我们需要移植UDFs。
    • Presto:试试看?
  • Snowflake:还不错。
  • SQLite3:可能很快就会删除。可能会用DuckDB替换?

如果您想运行 的生产工作负载,您几乎肯定需要贡献代码。 特别是我们API的覆盖范围有限。请参阅 tests/sql/ 以了解我们支持的内容。

设计理念

在一个 理想 的世界中,joinery 会做以下两件事情之一

  1. 将您的SQL翻译成在目标数据库上运行完全相同的东西,或者
  2. 报告一个清晰的错误,说明为什么它不能。

在现实世界中,BigQuery 的标准 SQL 以及我们的目标方言都没有任何正式的语义,其中涉及了大量的经验主义和猜测。但 joinery 已经被设计成随着时间的推移逐步接近理想。

安装

git clone https://github.com/faradayio/joinery.git
cd joinery
cargo install --path .

运行

joinery --help
joinery parse example_queries.csv
joinery sql-test tests/sql/

关于 sql-test 测试格式,请参阅 测试格式文档

支持数据库

SQLite3

这是默认设置。您不需要做任何事情。

Snowflake

您可以使用以下方法指定 Snowflake:

--database snowflake://<user>@<organization>-<account>[.privatelink]/<warehouse>/<database>

您还需要设置 SNOWFLAKE_PASSWORD 环境变量。

Trino

要在 Trino 下运行,您可能需要加载插件,具体请参阅 java/trino-plugin/README.md。如果您不介意一些关于 FARM_FINGERPRINT 的单元测试失败,您也可以直接运行

docker run --name trino -d -p 8080:8080 trinodb/trino

然后您需要启动 Trino 壳

docker exec -it trino trino

...并将 ./sql/trino_compat.sql 的内容粘贴进来。这将提供实现许多 BigQ 的 SQL UDF

然后您可以使用以下方式运行 joinery

--database "trino://anyone@localhost/memory/default"

开发

有关代码库概述,请参阅 ARCHITECTURE.md

其他相关项目

如果您对在多个数据库上运行分析 SQL 查询感兴趣,您可能还感兴趣:

  • PRQL。有很多语言可以编译成 SQL,但这个是我最喜欢的。它从上到下读取为一个管道,功能清晰且正交,并且处理窗口函数。如果您正在启动一个绿色项目,绝对值得一试。
  • Logica。这可能是最成熟的 Datalog-to-SQL 编译器,特别关注 BigQuery。
  • sqlglot。在许多不同的 SQL 方言之间进行转换。虽然它可能在一些复杂情况下生成错误的 SQL,但它的功能覆盖面比我们更好。如果您计划手动调整翻译后的查询,或者如果您需要支持各种方言,这可能比 joinery 更好。
  • dbt-core.
  • BigQuery Emulator。BigQuery 的本地模拟器。它支持的 BigQuery 功能比我们多。

依赖项

~0.6–1.1MB
~25K SLoC