当将源数据引入暂存层时,我遇到过这种在 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
就我而言,从任何来源选择 * 都是一个坏主意。我们很可能选择不需要的数据,这可能会产生不必要的成本,而且还会减慢我们的查询速度。我们很可能无法控制源数据,因此我们对所选择的内容绝对没有透明度。
有人发现我的逻辑有问题吗?我看到代码看起来非常干净,但是从成本/性能的角度来看,这怎么可能是一个好主意呢?
由于无法控制源表,您可能会偶然发现几个用例之一来实际使用
SELECT *
模式。然而,要做什么的答案实际上取决于您对如果源发生更改如何解决损坏的 ETL 的答案。
如果它很关键,无法及时返回以获取过去的数据,或者类似的东西,那么
SELECT *
是合适的,但你不会在那里应用转换,而是转储到暂存位置,然后转换关闭暂存地点。这样,如果列发生更改或数据完整性被破坏等,您仍然拥有数据,可以修复您的转换,而不会丢失数据。
但是如果你不在乎,可以修复你的 DBT 并重新提取数据,然后简单地使用类似的东西:
select id as payment_id, orderid as order_id from {{ source('stripe','payment') }}
正如您提到的,在这种情况下可能性能更高。