使用 DBT 查找两个表的 INTERSECT

问题描述

我想使用 DBT 查找 2 个表之间的公共列。但我无法找到正确的方法来做到这一点。 任何人都可以帮忙吗?提前致谢

解决方法

您可以创建一个使用 adapter.get_columns_in_relation() 和 jinja 的宏。

{% macro compare_columns(table1,table2) %}
    {% set columns1 = adapter.get_columns_in_relation(ref(table1)) %}
    {% set columns2 = adapter.get_columns_in_relation(ref(table2)) %}
    {% for column in columns1 %}
        {% if column in columns2 %}
            {{ log("Column: " ~ column.name,info=true) }}
        {% endif %}
    {% endfor %}
{% endmacro %}

get_columns_in_relation 返回一个 Column objects 的列表,其中包含列名和类型,所以上面的代码会确认列和它们的类型是一样的。如果您只想确认列名匹配,则需要添加逻辑来比较 if 语句开头的 name 属性。

   ...
    {% set columns2_cleaned = [] %}
    {% for column in columns2 %}
        {{ columns2_cleaned.append(column.name) }}
    {% endfor %}
    {% for column in columns1 %}
        {% if column.name in columns2_cleaned %}
   ...