使用dbt对(yar(月/日)表iceberg进行分区

问题描述 投票:0回答:1

我在 dbt 中创建了这个模型,并使用以下分区配置:

{{ config(
    materialized='incremental',
    incremental_strategy='append',
    partitioned_by=["year('sale_date')", "month('sale_date')", "day('sale_date')"],
    schema='ga_public_sale',
    pre_hook = [
        """{% if is_incremental() %}
        delete from {{this}}
        where
        sale_date >= current_date - interval '90' day
        {% endif %}
        """
    ]
) }}

SELECT
  sale_tend.transaction_number
, sale_tend.sale_date
, sale_tend.store_code
, sale_tend.transaction_index
, sale_tend.row_key
, sale_tend.sale_currency
, sale_tend.transaction_type_code
, sale_tend.transaction_type_group
, sale_tend.tender_number
, sale_tend.tender_type_code
, sale_tend.tender_amount
, sale_tend.tender_currency
, sale_tend.tender_code
, sale_tend.closure_cashier_code cashier_code
, sale_tend.consumer_code
, tender_type_text.tender_type_desc
, tender_type.tender_type_group_code
, tender_type_group_text.tender_type_group_desc
FROM
  ((((ga_curated_sale.car_sale_transaction sale_tend
LEFT JOIN ga_curated_customer.car_store_profile store_profile ON (sale_tend.store_code = store_profile.store_code))
LEFT JOIN ga_curated_tender.car_tender_type_text tender_type_text ON ((store_profile.profile_code = tender_type_text.profile_code) AND (sale_tend.tender_type_code = tender_type_text.tender_type_code) AND (tender_type_text.language = 'E')))
LEFT JOIN ga_curated_tender.car_tender_type tender_type ON ((store_profile.profile_code = tender_type.profile_code) AND (sale_tend.tender_type_code = tender_type.tender_type_code)))
LEFT JOIN ga_curated_tender.car_tender_type_group_text tender_type_group_text ON ((store_profile.profile_code = tender_type_group_text.profile_code) AND (tender_type.tender_type_group_code = tender_type_group_text.tender_type_group_code) AND (tender_type_group_text.language = 'E')))
WHERE (((sale_tend.transaction_type_code = '1001') OR (sale_tend.transaction_type_code = '1004')) AND (sale_tend.record_type_code = 21) AND (NOT (sale_tend.task_canceled_flg IN ('X'))))
{% if is_incremental()  %}
        AND sale_date >= current_date - interval '90' day
{% endif %}

列 sale_dat 是日期,我收到此错误“INVALID_TABLE_PROPERTY:无法解析分区值:无效的分区字段声明:年份(\u0027sale_date\u0027)。”

我尝试更改partitioned_by的一些配置,但仍然没有结果

amazon-athena dbt apache-iceberg
1个回答
0
投票

基于错误描述和分区上的 dbt 文档。

partitioned_by 应为特定字段,因此模型定义应为。

{{ config( materialized='incremental', incremental_strategy='append', partitioned_by=["year", "month", "day"], schema='ga_public_sale', pre_hook = [ """{% if is_incremental() %} delete from {{this}} where sale_date >= current_date - interval '90' day {% endif %} """ ] ) }} SELECT year(sale_tend.sale_date) as year , month(sale_tend.sale_date) as month , day(sale_tend.sale_date) as day , sale_tend.transaction_number , sale_tend.sale_date , sale_tend.store_code , sale_tend.transaction_index , sale_tend.row_key , sale_tend.sale_currency , sale_tend.transaction_type_code , sale_tend.transaction_type_group , sale_tend.tender_number , sale_tend.tender_type_code , sale_tend.tender_amount , sale_tend.tender_currency , sale_tend.tender_code , sale_tend.closure_cashier_code cashier_code , sale_tend.consumer_code , tender_type_text.tender_type_desc , tender_type.tender_type_group_code , tender_type_group_text.tender_type_group_desc FROM ((((ga_curated_sale.car_sale_transaction sale_tend LEFT JOIN ga_curated_customer.car_store_profile store_profile ON (sale_tend.store_code = store_profile.store_code)) LEFT JOIN ga_curated_tender.car_tender_type_text tender_type_text ON ((store_profile.profile_code = tender_type_text.profile_code) AND (sale_tend.tender_type_code = tender_type_text.tender_type_code) AND (tender_type_text.language = 'E'))) LEFT JOIN ga_curated_tender.car_tender_type tender_type ON ((store_profile.profile_code = tender_type.profile_code) AND (sale_tend.tender_type_code = tender_type.tender_type_code))) LEFT JOIN ga_curated_tender.car_tender_type_group_text tender_type_group_text ON ((store_profile.profile_code = tender_type_group_text.profile_code) AND (tender_type.tender_type_group_code = tender_type_group_text.tender_type_group_code) AND (tender_type_group_text.language = 'E'))) WHERE (((sale_tend.transaction_type_code = '1001') OR (sale_tend.transaction_type_code = '1004')) AND (sale_tend.record_type_code = 21) AND (NOT (sale_tend.task_canceled_flg IN ('X')))) {% if is_incremental() %} AND sale_date >= current_date - interval '90' day {% endif %}
    
© www.soinside.com 2019 - 2024. All rights reserved.