从 dbt 模型中提取 ref 和源表
Extracting ref and source tables from a dbt model
我在 dbt 中有一个模型,它使用不同的来源和参考表。所以我的问题是...
是否可以创建一个宏来从模型中提取所有引用表和源表?让我举个例子
我有这个型号:
select
*
from {{ ref('x') }} a
left join {{ source('landing', 'y') }} ma on a.... = ma....
left join {{ source('landing', 'z') }} b on a.... = b....
因此,一旦该模型的宏为 运行,我想获取名称或参考表和源表。那可能吗?我想在 dbt 中执行此操作,但如果改用 python 会更好,请告诉我。
谢谢!
-- my_macro.sql
{% macro get_dependencies(model_name) %}
{% set models = graph.nodes.values() %}
{% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}
{% do log("sources: ", info=true) %}
{% set sources = model['sources'] %}
{% for source in sources %}
{% do log(source[0] ~ '.' ~ source[1], info=true) %}
{% endfor %}
{% do log("refs: ", info=true) %}
{% set refs = model['refs'] %}
{% for ref in refs %}
{% do log(ref[0], info=true) %}
{% endfor %}
{% endmacro %}
一旦你添加了这个宏,试试这个……
dbt run-operation get_dependencies --args '{model_name: my_model}'
它会吐出来……
sources:
landing.y
landing.z
refs:
x
按照我目前的编写方式,它会写出任何重复的来源或模型。例如如果您在多个位置有 {{ ref('x') }}
,那么它会写出很多次。
refs:
x
x
x
我使用以下关于图形变量的文档将其拼凑在一起。
https://docs.getdbt.com/reference/dbt-jinja-functions/graph
编辑:
这是获取唯一的来源和参考文献列表的方法。它不是最漂亮的,但它确实有效。 (必须有更好的方法来获得一个独特的列表!)
{% macro get_dependencies(model_name) %}
{% set models = graph.nodes.values() %}
{% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}
{% set sources = model['sources'] %}
{% set refs = model['refs'] %}
{% do log("sources: ", info=true) %}
{% set unique_sources = [] %}
{% for source in sources if source not in unique_sources %}
{% do unique_sources.append(source) %}
{% do log(source[0] ~ '.' ~ source[1], info=true) %}
{% endfor %}
{% do log("refs: ", info=true) %}
{% set unique_refs = [] %}
{% for ref in refs if reference not in unique_refs %}
{% do unique_refs.append(ref) %}
{% do log(ref[0], info=true) %}
{% endfor %}
{% endmacro %}
我在 dbt 中有一个模型,它使用不同的来源和参考表。所以我的问题是... 是否可以创建一个宏来从模型中提取所有引用表和源表?让我举个例子
我有这个型号:
select
*
from {{ ref('x') }} a
left join {{ source('landing', 'y') }} ma on a.... = ma....
left join {{ source('landing', 'z') }} b on a.... = b....
因此,一旦该模型的宏为 运行,我想获取名称或参考表和源表。那可能吗?我想在 dbt 中执行此操作,但如果改用 python 会更好,请告诉我。
谢谢!
-- my_macro.sql
{% macro get_dependencies(model_name) %}
{% set models = graph.nodes.values() %}
{% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}
{% do log("sources: ", info=true) %}
{% set sources = model['sources'] %}
{% for source in sources %}
{% do log(source[0] ~ '.' ~ source[1], info=true) %}
{% endfor %}
{% do log("refs: ", info=true) %}
{% set refs = model['refs'] %}
{% for ref in refs %}
{% do log(ref[0], info=true) %}
{% endfor %}
{% endmacro %}
一旦你添加了这个宏,试试这个……
dbt run-operation get_dependencies --args '{model_name: my_model}'
它会吐出来……
sources:
landing.y
landing.z
refs:
x
按照我目前的编写方式,它会写出任何重复的来源或模型。例如如果您在多个位置有 {{ ref('x') }}
,那么它会写出很多次。
refs:
x
x
x
我使用以下关于图形变量的文档将其拼凑在一起。
https://docs.getdbt.com/reference/dbt-jinja-functions/graph
编辑:
这是获取唯一的来源和参考文献列表的方法。它不是最漂亮的,但它确实有效。 (必须有更好的方法来获得一个独特的列表!)
{% macro get_dependencies(model_name) %}
{% set models = graph.nodes.values() %}
{% set model = (models | selectattr('name', 'equalto', model_name) | list).pop() %}
{% set sources = model['sources'] %}
{% set refs = model['refs'] %}
{% do log("sources: ", info=true) %}
{% set unique_sources = [] %}
{% for source in sources if source not in unique_sources %}
{% do unique_sources.append(source) %}
{% do log(source[0] ~ '.' ~ source[1], info=true) %}
{% endfor %}
{% do log("refs: ", info=true) %}
{% set unique_refs = [] %}
{% for ref in refs if reference not in unique_refs %}
{% do unique_refs.append(ref) %}
{% do log(ref[0], info=true) %}
{% endfor %}
{% endmacro %}