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) -%}
{%- 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