dreamweaver做網(wǎng)站學(xué)習(xí)解析seo關(guān)鍵詞優(yōu)化怎么收費
DBT是一種功能強大的數(shù)據(jù)轉(zhuǎn)換工具,它使數(shù)據(jù)分析師和工程師能夠更有效地轉(zhuǎn)換倉庫中的數(shù)據(jù)。dbt的一個關(guān)鍵特性是能夠創(chuàng)建快照,這是跟蹤數(shù)據(jù)隨時間變化的一種方法。本文帶你一起完成創(chuàng)建和使用dbt快照的過程。
理解緩慢變化維度
緩慢變化維度(scd)是數(shù)據(jù)倉庫中的概念,指的是數(shù)據(jù)(通常為主數(shù)據(jù))隨時間緩慢變化方式。它們被稱為“緩慢變化”,因為這些變化相對不經(jīng)常發(fā)生,如客戶的地址或產(chǎn)品的分類,但這些變化的影響對數(shù)據(jù)分析來說可能是重大的。
scd通常分為三種類型:
- 類型1: 這種方法用新數(shù)據(jù)覆蓋舊數(shù)據(jù),因此不保留歷史記錄。
- 類型2: 這種方法使用新數(shù)據(jù)添加新記錄,并將舊記錄保留為歷史數(shù)據(jù)。這是最常見的SCD類型,也是dbt快照實現(xiàn)的SCD類型。
- 類型3: 這種方法為新數(shù)據(jù)添加新列,并在原始列中保留舊數(shù)據(jù)。這種類型不太常見,只在需要查看更改進展的情況下使用。
dbt快照與scd的概念直接相關(guān),特別是類型2 scd。dbt中的快照是一種跟蹤數(shù)據(jù)隨時間變化的方法,可以有效地創(chuàng)建每行數(shù)據(jù)的版本歷史記錄。創(chuàng)建快照時,dbt將元數(shù)據(jù)列添加到數(shù)據(jù)中,包括dbt_valid_from
和dbt_valid_to
,它們表示記錄的特定版本有效的時間范圍。
這種機制允許dbt快照實現(xiàn)類型2 scd。當(dāng)源數(shù)據(jù)發(fā)生更改時,dbt不是覆蓋現(xiàn)有記錄(類型1)或添加新列(類型3),而是添加帶有新數(shù)據(jù)的新記錄(類型2)。快照表中的dbt_valid_from
和dbt_valid_to
列表示記錄的每個版本何時有效,從而允許您跟蹤一段時間內(nèi)更改的完整歷史。
實戰(zhàn)案例
創(chuàng)建dbt 快照模型
dbt中的快照模型是一種特殊的模型,用于跟蹤數(shù)據(jù)隨時間的變化。要創(chuàng)建快照模型,需要在dbt項目的snapshots
目錄中創(chuàng)建一個新文件。這個文件應(yīng)該包含一個snapshots
塊,并定義快照的配置。
下面是一個快照模型的例子,它跟蹤用戶表中的變化:
{% snapshot users_snapshot %} {{config( target_schema='snapshots', strategy='timestamp', unique_key='id', updated_at='updated_at' )
}} select * from raw.users{% endsnapshot %}
在本例中,策略被設(shè)置為timestamp
,這意味著dbt將基于updated_at
列跟蹤更改。unique_key
設(shè)置為id
,這是用戶表中每一行的唯一標(biāo)識符。
理解快照策略
在dbt中,創(chuàng)建快照有兩種主要策略:時間戳策略和檢查策略。
- 時間戳策略
時間戳策略用于源數(shù)據(jù)包含時間戳列的情況,該列在記錄更改時進行更新。在這種策略中,只要時間戳列比上一次運行快照的時間更近,dbt就會創(chuàng)建一個新的快照記錄。當(dāng)您希望根據(jù)更改發(fā)生的時間跟蹤更改時,此策略非常有用。您可以在前一段中看到時間戳策略的示例。
- 檢查策略
另一方面,當(dāng)希望根據(jù)特定列的值跟蹤更改時,可以使用check策略。在此策略中,只要指定列中的值與上次運行快照時不同,dbt就會創(chuàng)建新的快照記錄。如果希望根據(jù)更改內(nèi)容而不是更改時間來跟蹤更改時,此策略非常有用。
下面是一個使用check策略的快照配置示例:
{% snapshot users_snapshot %} {{ config( target_schema='snapshots', strategy='check', unique_key='id', check_cols=['status'] )
}} select *
from raw.users{% endsnapshot %}
在本例中,當(dāng)用戶的**status
** 列發(fā)生變化時,dbt將創(chuàng)建新的快照記錄。為快照選擇正確的策略取決于源數(shù)據(jù)的性質(zhì)和用例的特定需求。
運行快照模型
一旦創(chuàng)建了快照模型,就可以使用dbt snapshot
命令運行它。該命令將執(zhí)行dbt項目中的所有快照模型,并在數(shù)據(jù)倉庫中創(chuàng)建了新的快照表。
以下是運行快照模型的方法:
dbt snapshot
運行此命令后,您應(yīng)該在snapshot模式(或在快照配置中指定的目標(biāo)模式)下的數(shù)據(jù)倉庫中看到新創(chuàng)建的快照表。
快照模型數(shù)據(jù)
dbt創(chuàng)建的快照表包含數(shù)據(jù)的完整歷史記錄,每行表示記錄的不同版本?,F(xiàn)狀可以查詢此表,以查看數(shù)據(jù)隨時間的變化情況。
下面是查詢示例,顯示了對users表狀態(tài)列的所有更改:
select id, status, dbt_valid_from, dbt_valid_to
from snapshots.users_snapshot
order by id, dbt_valid_from;
該查詢將返回一個結(jié)果集,其中顯示每個status
值何時對每個用戶有效。
高級快照技術(shù)
除了基本的快照功能之外,dbt還提供了一些高級特性,可以幫助您更有效地管理快照。例如,可以使用invalidate_hard_deletes
配置選項來跟蹤已從源數(shù)據(jù)中刪除的記錄。
以下是如何修改前節(jié)的示例快照模型來跟蹤硬刪除:
{% snapshot users_snapshot %} {{ config( target_schema='snapshots', strategy='timestamp', unique_key='id', updated_at='updated_at', invalidate_hard_deletes=True )
}} select *
from raw.users{% endsnapshot %}
通過這種配置,dbt將為從users表中刪除的每條記錄在快照表中創(chuàng)建新記錄行,dbt_valid_to列設(shè)置為刪除的時間戳。
最佳實踐指南
在使用dbt快照時,您應(yīng)該遵循以下幾個最佳實踐:
- 保持簡單: 避免在快照模型中添加復(fù)雜的邏輯或連接。如果需要可以在創(chuàng)建快照之后,在下游模型中實現(xiàn)這些邏輯。
- 為快照配置獨立schema: 這樣更容易區(qū)分快照表和數(shù)據(jù)倉庫中其他類型的表。
- 確保unique鍵的唯一性: 在快照配置中指定的unique鍵應(yīng)該唯一地標(biāo)識源數(shù)據(jù)中的每條記錄。
總結(jié)
DBT快照是跟蹤數(shù)據(jù)隨時間變化的強大工具。通過學(xué)習(xí)本教程,現(xiàn)在應(yīng)該對如何創(chuàng)建和使用dbt快照有了較好的理解。期待您的真誠反饋,更多內(nèi)容請閱讀數(shù)據(jù)分析工程專欄。