在dbt中创建过程

问题描述 投票:0回答:1

我正在使用 dbt 进行 DWH 自动化。我有大约 40 个程序需要在我的数据库上使用 dbt 进行部署。建议使用 dbt 而不是存储过程,但我需要继续使用这些过程。我尝试创建一种新的物化类型。我还尝试将过程体放入宏中,但一次只能运行一个宏。我需要一个可以运行路径宏/过程中的所有宏的宏。 以下代码给我编译器错误“list”未定义

{% macro run_models_in_proc() %}
    {# Get the list of models from the `macros/procedures` directory #}
    {% set models_to_run = list() %}
    
    {% for model in graph.nodes.values() %}
        {% if model.path.startswith('macros/procedures/') %}
            {% do models_to_run.append(model.name) %}
        {% endif %}
    {% endfor %}

    {# Print the models that will be run #}
    {% for model in models_to_run %}
        {{ log('Running model: ' ~ model, info=True) }}
    {% endfor %}
{% endmacro %}

如何让代码运行?

sql database stored-procedures jinja2 dbt
1个回答
0
投票

取决于所使用的数据库,但其想法是将过程创建包装在宏中。然后使用 on-run-start 就可以在 dbt run/build 启动时调用创建过程的 dbt 宏。

这是雪花的示例:

文件:macros/parse_user_agent.sql

{% macro create_parse_user_agent_udf() %}

create or replace function {{ target.database }}.{{ target.schema }}.parse_user_agent(useragent text)
returns variant
language python
runtime_version = '3.10'
packages = ('ua-parser')
handler = 'parse_user_agent'
as
$$
from ua_parser import user_agent_parser

def parse_user_agent(useragent):
    parsed_string = user_agent_parser.Parse(useragent)
    return {
        'browser_family': parsed_string.get('user_agent', {}).get('family'),
        'browser_version_major': parsed_string.get('user_agent', {}).get('major'),
        'browser_version_minor': parsed_string.get('user_agent', {}).get('minor'),
        'browser_version_patch': parsed_string.get('user_agent', {}).get('patch'),
        'os_family': parsed_string.get('os', {}).get('family'),
        'os_version_major': parsed_string.get('os', {}).get('major'),
        'os_version_minor': parsed_string.get('os', {}).get('minor'),
        'os_version_patch': parsed_string.get('os', {}).get('patch'),
        'os_version_patch_minor': parsed_string.get('os', {}).get('patch_minor'),
        'device_family': parsed_string.get('device', {}).get('family'),
        'device_brand': parsed_string.get('device', {}).get('brand'),
        'device_model': parsed_string.get('device', {}).get('model')
    }
    $$
;

{% endmacro %}

dbt_project.yml
必须包含以下内容:

on-run-start:
  -  '{{ create_parse_user_agent_udf()}}'

另一种选择是使用 dbt run-operation 来调用宏。这样

on-run-start
中的
dbt_project.yml
部分就不需要了。

© www.soinside.com 2019 - 2024. All rights reserved.