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

相关推荐
莫叫石榴姐24 分钟前
一份热乎的阿里25届数据分析面试题
数据库·数据仓库·sql·算法·数据挖掘·数据分析
isNotNullX3 小时前
ETL架构类型有哪些?怎么选择?
数据仓库·架构·etl
不叫猫先生7 小时前
从数据仓库到数据飞轮:数据技术演进的探索与思考
大数据·数据仓库·spark·数据中台·数据飞轮
尘世壹俗人8 小时前
presto操作hive数据的时候如何覆盖写数据
数据仓库·hive·hadoop
SelectDB技术团队13 小时前
Apache Doris 2.1.6 版本正式发布
大数据·数据库·数据仓库·开源·doris
Data 3171 天前
Shell脚本编程基础(二)
大数据·linux·运维·数据仓库·sql·centos·bash
最强大神1 天前
2025年最新大数据毕业设计选题-基于Hive分析相关
大数据·数据仓库·毕业设计·毕业设计选题·大数据毕业设计选题·大数据毕设·大数据毕设选题
Yz98761 天前
Hadoop-MapReduce的 原理 | 块和片 | Shuffle 过程 | Combiner
大数据·数据库·数据仓库·hadoop·mapreduce·big data
RestCloud1 天前
一文说清楚ETL与Kafka如何实现集成
数据仓库·kafka·etl·数据处理·数据集成