gpt4 book ai didi

sql - 如何在不扫描整个表的情况下选择 DBT 中 bigquery 表的最新分区?

转载 作者:行者123 更新时间:2023-12-03 23:40:06 27 4
gpt4 key购买 nike

我正在尝试从 BigQuery 表中选择最新的分区,而不是在 DBT 模型中扫描整个表,以节省查询成本。
DBT 不允许在数据模型中使用分号,因此使用 DECLARE + SET脚本语句不能按建议工作 here .
DBT 有一个 sql_header 宏,它允许在 header 中设置一些变量,但该 header 不接受对数据模型的引用,或者至少以下代码未编译:

{{ config(
sql_header=" DECLARE latest_partition_date DATE;
DECLARE latest_load_timestamp TIMESTAMP;
SET latest_partition_date = (SELECT MAX(_PARTITIONDATE) FROM {{ ref("model") }} );
SET latest_load_timestamp = (SELECT MAX(loaded_at) FROM {{ ref("model") }} WHERE _PARTITIONDATE = latest_partition_date);"
) }}

-- set the main query
SELECT * FROM {{ ref("model") }}
WHERE
-- Select the latest partition to reduce 'Bytes processed' for loading the query.
_PARTITIONDATE = latest_partition_date
-- Select the latest load within the latest partition to get only one duplicate of data.
AND loaded_at = latest_load_timestamp
我需要在标准 SQL 中解决这个问题。
建议的其他方法包括设置 WHERE _PARTITIONDATE = CURRENT_DATE()或使用 DATE_SUB(CURRENT_DATE(), 3)但这些并不令人满意,因为数据加载中断是不可预测的,只有动态选择最新的才能在这里工作。那可能吗?

最佳答案

您可以在另一个查询中执行此操作并将结果作为变量获取,如下所示:

    {%- call statement('max_partition', fetch_result=True) -%}
SELECT MAX(_PARTITIONDATE) FROM {{ ref("model") }} )
{%- endcall -%}

{%- set max_date = load_result('max_partition')['data'][0][0] -%}

SELECT * FROM {{ ref("model") }}
WHERE
_PARTITIONDATE = {{ max_date }}

关于sql - 如何在不扫描整个表的情况下选择 DBT 中 bigquery 表的最新分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66277165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com