gpt4 book ai didi

sql - 如何将变量解析为 dbt 中的源引用?

转载 作者:行者123 更新时间:2023-12-05 06:01:24 24 4
gpt4 key购买 nike

我正在构建一个模型,在该模型中,我根据查询结果动态引用表名和模式名。

    {%- set query %}
select * from master_data.event_metadata where game='{{game_name}}'
{% endset -%}
{%- set results = run_query(query) -%}
{%- if execute %}
{%- set record = results.rows[0] -%}
{% else %}
{%- set record = [] -%}
{% endif -%}

其中两个值位于 record.SCHEMA_NAMErecord.TABLE_NAME 中。我可以使用类似的东西

select
*
from
{{record.SCHEMA_NAME}}.{{record.TABLE_NAME}}

但我宁愿使用 source() 函数,这样我的文档和 DAG 就会很干净。如何将 record.SCHEMA_NAMErecord.TABLE_NAME 解析为字符串参数。我需要有类似的东西

select
*
from
{{ source(record.SCHEMA_NAME, record.TABLE_NAME) }}

当我尝试运行上面的代码时,出现以下错误:

Server error: Compilation Error in rpc request (from remote system)
The source name (first) argument to source() must be a string, got <class 'jinja2.runtime.Undefined'>

最佳答案

您可能已经找到了解决方法或解决方案,但以防万一其他人遇到同样的情况...

要将值转换为字符串,您可以使用|string。例如:

record.SCHEMA_NAME|string
record.TABLE_NAME|string

所以你的查询看起来像这样:

select * from {{ source(record.SCHEMA_NAME|string|lower, record.TABLE_NAME|string|lower) }}

请注意,根据您的查询输出和您定义源文件的方式,您可能必须降低提高您的值以与您的源相匹配。

问题

您的 record 变量是执行结果 (run_query(query))。当你执行 dbt compile/run dbt 将执行一系列操作,如读取项目的所有文件,生成“manifest.json”文件,并将使用 ref/source 生成 DAG,所以此时,没有执行 SQL,换句话说,execute == False

在您的示例中,即使您执行了 record.SCHEMA_NAME|string,您也将无法检索该变量的值,因为没有执行任何操作,并且因为您执行了 if not execute then record = [] ,您将收到该消息 ... 取决于名为“.”的源未找到,因为此时 record 为空。

解决方法是将模型的查询包装在 if execute block 中,如下所示:

{% if execute %}
select * from {{ source(record.TABLE_SCHEMA|string|lower, record.TABLE_NAME|string|lower) }}
{% endif %}

通过这种方法,您将能够动态设置模型的来源。

但不幸的是,这不会像您预期的那样工作,因为它不会为该模型生成 DAG。使用 if execute block 来包装模型的查询将阻止 dbt 为模型生成 DAG。

最后,这与您第一次尝试在没有 source 函数的情况下声明 schematable 是一样的。

更多详细信息,您可以查看有关执行模式的dbt文档: https://docs.getdbt.com/reference/dbt-jinja-functions/execute

关于sql - 如何将变量解析为 dbt 中的源引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67219316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com