DBT - 在暂存层中使用 SELECT *

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

当将源数据引入暂存层时,我遇到过这种在 DBT 中使用 * 选择所有列的模式。

您可以在关于暂存层的dbt 文档中找到它,但在这个 dbt 课程中。

模式是这样的:

with

source as (

    select * from {{ source('stripe','payment') }}

),

transformed as (

    select
        id as payment_id,
        orderid as order_id,
    from source
)
select * from transformed

就我而言,从任何来源选择 * 都是一个坏主意。我们很可能选择不需要的数据,这可能会产生不必要的成本,而且还会减慢我们的查询速度。我们很可能无法控制源数据,因此我们对所选择的内容绝对没有透明度。

有人发现我的逻辑有问题吗?我看到代码看起来非常干净,但是从成本/性能的角度来看,这怎么可能是一个好主意呢?

sql optimization dbt staging-table
1个回答
0
投票

由于无法控制源表,您可能会偶然发现几个用例之一来实际使用

SELECT *
模式。然而,要做什么的答案实际上取决于您对如果源发生更改如何解决损坏的 ETL 的答案。

如果它很关键,无法及时返回以获取过去的数据,或者类似的东西,那么

SELECT *
是合适的,但你不会在那里应用转换,而是转储到暂存位置,然后转换关闭暂存地点。这样,如果列发生更改或数据完整性被破坏等,您仍然拥有数据,可以修复您的转换,而不会丢失数据。

但是如果你不在乎,可以修复你的 DBT 并重新提取数据,然后简单地使用类似的东西:

select id as payment_id, orderid as order_id from {{ source('stripe','payment') }}

正如您提到的,在这种情况下可能性能更高。

© www.soinside.com 2019 - 2024. All rights reserved.