Google bigquery 加载BigQuery表时,变量作为dbt中的分区日期

Google bigquery 加载BigQuery表时,变量作为dbt中的分区日期,google-bigquery,partition,dbt,Google Bigquery,Partition,Dbt,在尝试使用增量模式加载分区表时,我遇到了一些问题。每个分区都是基于作为参数传递的执行日期变量创建的。 由于某些原因,新分区总是使用CurrentDate作为分区值生成。即使变量作为参数作为不同的日期值传递。 我已经定义了一个宏来格式化通过命令行传递的变量。 请在下面找到宏的代码: {% macro formatted_date(execution_date) %} {% set execution_date_obj = modules.datetime.datetime.strptime(e

在尝试使用增量模式加载分区表时,我遇到了一些问题。每个分区都是基于作为参数传递的执行日期变量创建的。 由于某些原因,新分区总是使用CurrentDate作为分区值生成。即使变量作为参数作为不同的日期值传递。 我已经定义了一个宏来格式化通过命令行传递的变量。 请在下面找到宏的代码:

{% macro formatted_date(execution_date) %}
  {% set execution_date_obj = modules.datetime.datetime.strptime(execution_date|string, "%Y%m%d") %}
  {{ return(execution_date_obj.strftime("%Y-%m-%d")) }}
{% endmacro %}
下面是我如何定义用于加载表的dbt模型:

{{config(alias='unipr_salesforce',
    materialized = 'incremental',
    partitions = [formatted_date(var('execution_date'))]
)}}
最后,这是用于运行dbt模型的命令,您可以在其中看到用作参数的变量:

unipr-subscription-pipeline toledanof$ dbt run --target dev --profiles-dir ./ --vars 'execution_date : "20210310"' 
每次运行dbt模型时,生成的分区都对应于CurrentDate,而与执行日期值无关。
有人知道这种行为的可能原因吗?谢谢大家!

您尝试做的事情似乎有几个问题:

  • 您需要告诉dbt要分区的列的名称,以便能够写入特定分区。如果不这样做,dbt会将其视为一个增量更新但没有分区的模型
  • 为了能够指定要替换的分区,您需要使用
    insert\u overwrite
    。当您没有明确指定策略时,dbt默认为
    merge
    ,它扫描整个表以决定更新什么和插入什么(我认为需要您在配置中指定一个
    unique_key
  • 解决这个问题的一种方法是将当前日期作为列包含在模型中,并将其用作分区键。以下是您的配置的外观:

    {{
      config(
        materialized='incremental',
        partition_by={'field': 'current_date', 'data_type': 'date'},
        incremental_strategy='insert_overwrite',
        partitions=[formatted_date(var('execution_date'))]
      )
    }}
    

    非常感谢您的回复。其思想不是按字段划分,而是按摄取时间划分。我已经使用materialized='table'创建了一个目标分区表。这样,dbt会根据伪列_PARTITIONDATE自动对表进行分区。但是,我们希望使用materialized='incremental',到目前为止,我还无法对其进行分类。