dbt class 可以用来创建数据仓库中的一些对象(比如关系,列)当需要通过高级模式进行模型以及宏构建的时候就比较有用
在不少开源同时也包括官方core 中都有使用到

主要包含的功能

  • Relation 对象创建
    参考(对于在宏中使用 api.Relation.create创建)

 

{% set relation = api.Relation.create(schema='snowplow', identifier='events') %}
  • Column 创建
{%- set string_column = api.Column('name', 'varchar', char_size=255) %}

dremio 中的使用

比如buildin 改写的时候

{%- macro ref(model_name) -%}
比如buildin 改写的时候

 {%- macro ref(model_name) -%}
  {%- set relation = builtins.ref(model_name) -%}
  {%- if execute -%}
    {%- set model = graph.nodes.values() | selectattr("name", "equalto", model_name) | list | first -%}
    {%- if model.config.materialized == 'reflection' -%}
      {% do exceptions.CompilationError("Reflections cannot be ref()erenced (" ~ relation ~ ")") %}
    {%- endif -%}
    {%- set format = model.config.format if
      model.config.materialized not in ['view', 'reflection']
      and model.config.format is defined
      else none -%}
    {%- set format_clause = format_clause_from_node(model.config) if format is not none else none -%}
    {%- set relation2 = api.Relation.create(database=relation.database, schema=relation.schema, identifier=relation.identifier, format=format, format_clause=format_clause) -%}
    {{ return (relation2) }}
  {%- else -%}
    {{ return (relation) }}
  {%- endif -%}
{%- endmacro -%}
 
{%- macro source(source_name, table_name) -%}
  {%- set relation = builtins.source(source_name, table_name) -%}
  {%- if execute -%}
    {%- set source = graph.sources.values() | selectattr("source_name", "equalto", source_name) | selectattr("name", "equalto", table_name) | list | first -%}
    {%- set format = source.external.format if
      source.external is defined
      and source.external.format is defined
      else none -%}
    {%- set format_clause = format_clause_from_node(source.external) if format is not none else none -%}
    {%- set relation2 = api.Relation.create(database=relation.database, schema=relation.schema, identifier=relation.identifier, format=format, format_clause=format_clause) -%}
    {{ return (relation2) }}
  {%- else -%}
    {{ return (relation) }}
  {%- endif -%}
{%- endmacro -%}

说明

dbt 还提供了其他一些比较有用的宏,可以进行一些内置功能的改写(可以用来判断对于dbt 兼容的支持)
比如builtins 包含了ref,source,同时adapter 支持了不少功能(具体参考链接),dispatch 使用的地方也
比较多可以进行方便的重定向支持(就是将方法的调用使用其他模块提供的方法进行替换),对于开放三
方模式以及一些高级功能开发的时候比较有用

参考资料

https://docs.getdbt.com/reference/dbt-classes#relation
https://github.com/dremio/dbt-dremio
https://docs.getdbt.com/reference/dbt-jinja-functions/adapter
https://docs.getdbt.com/reference/dbt-jinja-functions/dispatch
https://docs.getdbt.com/reference/dbt-jinja-functions/builtins
https://docs.getdbt.com/reference/dbt-jinja-functions/config