dbt compile 命令及应用

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

应用场景

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

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

sql 复制代码
-- analyses/running_total_by_account.sql

with journal_entries as (

  select *
  from {{ ref('quickbooks_adjusted_journal_entries') }}

), accounts as (

  select *
  from {{ ref('quickbooks_accounts_transformed') }}

)

select
  txn_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

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

shell 复制代码
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/目录生成文件。举例:

sql 复制代码
dbt compile --select "stg_orders"                           
dbt compile --inline "select * from {{ ref('raw_orders') }}"

输出结果如下:

sql 复制代码
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 (

    select
        id as order_id,
        user_id as customer_id,
        order_date,
        status
    from source
)

select * from renamed
sql 复制代码
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命令,包括应用场景、详细说明及注意事项。了解这些信息,有助于在项目中高效使用该命令。

相关推荐
不会写代码的女程序猿17 小时前
关于ETL的两种架构(ETL架构和ELT架构)
数据仓库·架构·etl
ssxueyi1 天前
数据仓库有哪些?
大数据·数据仓库·数据湖
武子康1 天前
大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
大数据·数据仓库·hive·hadoop
向阳逐梦1 天前
开源云原生数据仓库ByConity ELT 的测试体验
数据仓库·云原生·开源
ssxueyi1 天前
数据仓库是什么?数据仓库简介
数据仓库
小刘鸭!2 天前
Hive解决数据倾斜
数据仓库·hive·hadoop
武子康2 天前
大数据-255 离线数仓 - Atlas 数据仓库元数据管理 数据血缘关系 元数据
大数据·数据仓库·hive·hadoop·spring
故苏呦2 天前
全域数据集成平台ETL
数据仓库·etl
梦想画家3 天前
DuckDB:JSON数据探索性分析实战教程
数据分析·json·数据工程·duckdb·分析工程
武子康4 天前
大数据-253 离线数仓 - Airflow 任务调度 核心概念与实际案例测试 Py脚本编写
java·大数据·数据仓库·hive·hadoop·springboot