引用要替换的增量模型分区-dbt v0.17.2

3ks5zfa0  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(334)

我正在使用 insert_overwrite 策略和尝试设置 partitions_to_replace 使用变量:

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

只是为了测试编译,我在我的 dbt_project.yml 看起来像 execution_date: '2020-01-01' . 但是,似乎在物化生成的merge语句中,日期没有被引用,因此失败并返回错误 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是由具体化生成的。

vtwuwzda

vtwuwzda1#

这是个公平的问题。为了灵活性,物化并不试图 Package partitions 引号中的值,作为支持sql表达式和文本作为潜在输入的一种方式。
i、 你可能想要 merge predicate 为:

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对我们可以添加的语法有一些建议,以使这更简单;我很想知道哪一个对你有意义。

相关问题