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

相关推荐
Yz98765 小时前
hive复杂数据类型Array & Map & Struct & 炸裂函数explode
大数据·数据库·数据仓库·hive·hadoop·数据库开发·big data
EDG Zmjjkk7 小时前
Hive 函数(实例操作版2)
数据仓库·hive·hadoop
B站计算机毕业设计超人7 小时前
计算机毕业设计SparkStreaming+Kafka新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
数据仓库·爬虫·python·数据分析·kafka·数据可视化·推荐算法
Moshow郑锴8 小时前
数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别
大数据·数据库·数据仓库·数据湖·湖仓一体
Yz98761 天前
Hive分桶超详细!!!
大数据·数据仓库·hive·hadoop·hdfs·数据库开发·big data
Francek Chen1 天前
【大数据技术基础 | 实验十一】Hive实验:新建Hive表
大数据·数据仓库·hive·hadoop·分布式
Dreams°1231 天前
【大数据测试ETL:从0-1实战详细教程】
大数据·数据仓库·python·单元测试·etl
liuweni2 天前
PuppyGraph:实时图查询引擎,无需ETL
数据仓库·etl
锵锵锵锵~蒋2 天前
实时数据研发 | Flink技术栈
大数据·数据仓库·flink·数据研发
isNotNullX3 天前
浅谈数据仓库的架构及其演变
大数据·数据库·数据仓库·架构·etl·数据同步