0.0.1 |
|
---|
#21 在 #dialect
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
会做以下两件事情之一
- 将您的SQL翻译成在目标数据库上运行完全相同的东西,或者
- 报告一个清晰的错误,说明为什么它不能。
在现实世界中,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