我想使用DBT将数据插入到分区表中,但发现不支持DBT Postgres分区。
通过另一种方式,我在pre_hook中创建了表和分区,但是在运行dbt时得到了错误“relation 'download_counts_p' already exists”
有什么建议吗?这是我的SQL和pre_hook配置
{{ config(
materialized = 'table',
indexes = [ ],
pre_hook=[
'CREATE TABLE IF NOT EXISTS "download_counts_p" (
"channel_id" int8 NOT NULL,
"product_id" int8 NOT NULL,
"country_code" text NOT NULL,
"year" int2 NULL,
"month" int2 NOT NULL,
"count" int8 NOT NULL,
"count" int8 NOT NULL,
"months" int8 NOT NULL
) partition by list(country_code)',
"DO $$
Declare unique_country_code varchar;
BEGIN
FOR unique_country_code IN
SELECT country_code as unique_country_code FROM download_counts group by country_code
LOOP
EXECUTE format('create table IF NOT EXISTS download_counts_p_%s partition of download_counts_p for values in (''%s'')', upper(unique_country_code), unique_country_code);
END LOOP;
END; $$;"]
)}}
select 1
2条答案
按热度按时间ffscu2ro1#
这里发生了一些不同的事情。
1.你的
FOR ... LOOP ... END LOOP
钩子应该使用jinja循环编写成它自己的模型,你可以使用run_query
宏将数据返回到jinja上下文,在该页的底部有一个例子,它将查询结果提取到jinja上下文,然后使用{% for payment_method in results_list %}
循环osh3o9ms2#
在DBT中,DDL表的创建是自动完成的,运行钩子前或钩子后没有帮助,因为PostgreSQL不允许将表更改为具有分区子句。
代替pre_hook块--每个模块都需要这样做--可以修改来自DBT postgres的create table语句来处理表分区创建。这个解决方案支持范围和列表类型。
作为PostgreSQL DDL语句的示例
修改此DDL以包含PARTITION BY子句之后,可以创建并附加分区
应用自适应
1-在你的项目中找到postgres dbt适配器,通常路径如下:
2-修改
postgres__create_table_as
宏内容如下:3-选择要创建的模块中的分区列表,如下所示:
参考和更多详情https://medium.com/@fmohammad_91999/postgresql-table-partitioning-in-dbt-6d6ed82e90ca