1

我正在使用该策略为 BigQuery 编写增量模型insert_overwrite并尝试partitions_to_replace使用变量设置:

{% set partitions_to_replace = [var('execution_date')] %}

只是为了测试编译,我正在编译一个dbt_project.yml看起来像execution_date: '2020-01-01'. 但是,在物化生成的合并语句中,似乎没有引用日期,因此它失败并出现错误No matching signature for operator IN for argument types DATE and {INT64}。这是生成的 SQL 的相关片段:

when not matched by source
         and DBT_INTERNAL_DEST.visit_date in (
              2020-01-01
          ) 

有没有办法确保变量周围的引号?在我编写的 SQL 中使用变量时,我知道我可以将var函数用引号括起来,但在这种情况下,SQL 是由物化生成的。

4

2 回答 2

3

这是一个公平的问题。为了灵活性,物化不会尝试将partitions值括在引号中,作为支持 SQL 表达式和文字作为潜在输入的一种方式。

即您可能希望merge谓词是:

when not matched by source
         and DBT_INTERNAL_DEST.visit_date in (
              '2020-01-01'
          ) 

但您可能同样希望它是:

    when not matched by source
         and DBT_INTERNAL_DEST.visit_date in (
              date_sub(current_date, interval 1 day)
          ) 

因此,您需要:

  • var通过用双引号括起来将字符串文字传递给您:
vars:
  execution_date: "'2020-01-01'"
  • set或按照以下方式处理您的声明中的附加引用:
{% set partitions_to_replace = [] %}
{% for execution_date in [var('execution_date')] %}
    {% set ex_date %} '{{ execution_date }}' {% endset %}
    {% do partitions_to_replace.append(ex_date) %}
{% endfor %}

查看此相关问题。OP 对语法有一些建议,我们可以添加以使其更直接;我很想知道其中哪些对你有意义。

于 2020-08-07T21:58:57.143 回答
0

我在通过 var 传递时遇到了同样的问题cli。IE:

dbt run --vars "execution_date: 2021-09-28"

我的解决方法如下:

  • 设置一个partitions_to_replace变量。

{%- set partitions_to_replace -%} '{{var("execution_date")}}' {%- endset -%}

  • 然后在我的config我只是把这个变量里面list

partitions = [partitions_to_replace]

  • 最后,要在 SQL 模型中呈现变量,只需像这样调用它:

partition_date = {{partitions_to_replace}}

于 2021-09-29T15:12:24.523 回答