【问题标题】:Variable as partition date in dbt, when loading BigQuery table加载 BigQuery 表时,变量作为 dbt 中的分区日期
【发布时间】:2021-07-15 10:52:06
【问题描述】:

我在尝试使用增量模式加载分区表时遇到了一些问题。每个分区都是基于我作为参数传递的 execution_date 变量创建的。 由于某些原因,始终使用 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,而不管 execution_date 的值。 有人知道这种行为的可能原因吗?谢谢!

【问题讨论】:

    标签: google-bigquery partition dbt


    【解决方案1】:

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

    1. 您需要告诉 dbt 您想要分区的列的名称,以便能够写入特定分区。如果不这样做,dbt 会将其视为增量更新但没有分区的模型
    2. 为了能够指定要替换的分区,您需要使用insert_overwrite strategy。当您没有明确指定策略时,dbt 默认为 merge strategy,它会扫描整个表以确定要更新和插入的内容(我相信需要您在配置中指定 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',到现在还没有理清。
    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多