您的位置:首页 > 财经 > 产业 > dbt compile 命令及应用

dbt compile 命令及应用

2024/11/18 12:16:18 来源:https://blog.csdn.net/neweastsun/article/details/142340230  浏览:    关键词:dbt compile 命令及应用

编写dbt模型和存储过程有较大差异,比如不建议update和insert,大多数代码是select语句。同时需要引用jinja函数、复杂逻辑以及宏,这些差异经常让开发者不确定生成的模型是否满足需求。本文介绍dbt compile命令可以在开发过程中随时查看编译后的SQL语句,帮助开发者及时发现模型问题。

应用场景

dbt模型概念让数据团队可以轻松实现版本控制和协作,但当一些SQL语句不完全符合dbt模型框架规范时,我们可以在analysis目录中编写模型代码。任何在目录的SQL文件,dbt仅编译但不执行。这样模型代码中{{ ref(...) }}会编译为对应数据仓库中的表或视图等对象。

举例,假设下面模型代码:

-- analyses/running_total_by_account.sqlwith journal_entries as (select *from {{ ref('quickbooks_adjusted_journal_entries') }}), accounts as (select *from {{ ref('quickbooks_accounts_transformed') }})selecttxn_date,account_id,adjusted_amount,description,account_name,sum(adjusted_amount) over (partition by account_id order by id rows unbounded preceding)
from journal_entries
order by account_id, id

要编译上面文件,可以执行命令;

dbt compile

然后我们可以在目录下看到编译后的文件: target/compiled/{project name}/analyses/running_total_by_account.sql. 可以在可视化工具中粘贴并执行,注意改命令不会在目标数据库中创建物化关系:running_total_by_account ,因为这些是分析不是模型。下面详细介绍dbt compile 命令。

dbt compile 命令详解

dbt compile 命令从下面目录中源模型文件生成可执行SQL文件:model, test, analysis ,生成的SQL文件在项目内 target/目录下。

dbt compile 应用场景:

  1. 检查编译输出文件,验证复杂jinja逻辑及宏
  2. 手动运行编译后的SQL,在调试或测试模型时,执行底层SELECT语句可以发现bug
  3. 编译analysis 目录下文件,但并不执行模型文件

注意事项:

  • dbt compile 命令不是 dbt run 或其他命令的先决条件,这些命令自己处理编译
  • dbt compile 命令需要数据平台连接,为了收集必要的信息(查询相关的数据库元数据),用于生成目标仓库的SQL代码
  • 如果你仅希望dbt读并验证项目代码,但不连接到数据仓库,使用 dbt parse 命令代替 ;dbt parse 解析验证dbt项目内容,如果项目包括Jinja或yaml语法错误,命令会失败

交互式编译

从dbt1.5开始,dbt compile 命令可以在命令行交互式执行,可以展示节点或任意dbt-sql查询编译后的代码:

  • – select 指定节点名称
  • – inline 指定任意dbt-sql查询

上面命令会在命令行打印编译后的SQL,同时在target/目录生成文件。举例:

dbt compile --select "stg_orders"                           
dbt compile --inline "select * from {{ ref('raw_orders') }}"

输出结果如下:

dbt compile --select "stg_orders"                           21:17:09  Running with dbt=1.7.5
21:17:09  Registered adapter: postgres=1.7.5
21:17:09  Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
21:17:09  
21:17:09 Concurrency: 24 threads (target='dev')
21:17:09  
21:17:09  Compiled node 'stg_orders' is:
with source as (select * from "jaffle_shop"."main"."raw_orders"
),renamed as (selectid as order_id,user_id as customer_id,order_date,statusfrom source
)select * from renamed
dbt compile --inline "select * from {{ ref('raw_orders') }}"18:15:49  Running with dbt=1.7.5
18:15:50  Registered adapter: postgres=1.7.5
18:15:50  Found 5 models, 3 seeds, 20 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
18:15:50  
18:15:50  Concurrency: 5 threads (target='postgres')
18:15:50  
18:15:50  Compiled inline node is:
select * from "jaffle_shop"."main"."raw_orders"

高级用法

dbt compile命令访问数据平台以获取与缓存相关的元数据,并实现内省查询。

可以使用--no-populate-cache标志来禁用初始缓存填充。如果需要元数据,则dbt在缓存中查询不到(缓冲丢失),需要dbt运行元数据查询。

也可以使用--no- introspection标志来禁用内省查询。如果模型的定义需要运行内省查询,但启用了此标志,则dbt将引发错误。

总结

本文介绍了dbt compile命令,包括应用场景、详细说明及注意事项。了解这些信息,有助于在项目中高效使用该命令。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com