我找到了一种处理 DBT 中临时表的方法,将所有这些写在预钩中并在预钩外部调用最终临时表,经过测试并且工作正常,能够减少代码运行时间超过 20 分钟到 1 分钟。但是我看到一个问题,我们在 DBT 文档中看不到谱系图。除了 pre-hook 和 Docs 中的 lineage 之外,还有什么方法可以处理临时表吗?
您认为 dbt 不支持临时表是正确的。那是因为临时表只在单个会话中持续存在,而 dbt 每个线程打开一个连接/会话。因此,在一个线程上创建的任何临时表对于在不同线程上运行的模型都是不可见的。
听起来 CTE 对您来说是一种性能拖累——出于兴趣,您使用的是哪个仓库?
您已经确定了两种解决方法,还有另一种值得讨论:
选项 1:使用具体ephemeral化 ( docs )将您的模型具体化为 CTE
优点:
ref-ing在多个下游模型中重用这些转换缺点:
选项 2:使用预挂钩创建临时表
我通常不建议这样做 - 您无法测试或记录您的模型,并且它们不会出现在谱系图中(正如您所指出的)。
选项 3:将这些模型具体化为单独模式中的表,并在运行结束时删除该模式
我认为迈克尔的建议很好!我会稍微调整一下:
{{ config(
materialized='table',
schema='my_temporary_schema'
) }}
Run Code Online (Sandbox Code Playgroud)
on-run-end钩子 ( docs ) 删除该架构 - 在您的dbt_project.yml:on-run-end: "drop schema my_temporary_schema cascade"
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
drop cascade命令时,它们可能会被丢弃!这给您的项目带来了脆弱性!小智 0
我认为有两种方法可以在保留文档中的沿袭的同时获得相同的结果:
select * from YOUR_TEMP_TABLE_NAME。on-run-end不要使用临时表,而是将每个表创建为常规模型,然后将它们放入使用它们的“最终”模型的 post_hook 中或放入dbt_project.yml.| 归档时间: |
|
| 查看次数: |
1449 次 |
| 最近记录: |