我正在使用 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 %}
如何让代码运行?
取决于所使用的数据库,但其想法是将过程创建包装在宏中。然后使用 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
部分就不需要了。