dbt incremental model ap kreye duplicate records
poze 2 days ago12 gadeht
Mwen gen yon dbt incremental model ki ap chaje done chak jou nan Snowflake. Men apre plizyè jou, mwen remake menm records yo parèt plizyè fwa nan destination table la.
What I tried
Mwen mete unique_key='transaction_id', men duplicate yo toujou ap parèt.
{{ config(
materialized='incremental',
unique_key='transaction_id'
) }}
SELECT
transaction_id,
customer_id,
amount,
transaction_date
FROM {{ source('sales', 'transactions') }}
{% if is_incremental() %}
WHERE transaction_date >= (
SELECT MAX(transaction_date)
FROM {{ this }}
)
{% endif %}
Error message
transaction_id | count
---------------|------
10001 | 3
10002 | 2
10003 | 4
Expected result
Chak transaction_id ta dwe parèt sèlman yon sèl fwa nan final table la.
🤖 Dyagnostik IA
Se IA ki fè l. Se pa yon repons — kominote a anba a konfime oswa korije l. Toujou verifye anvan ou fye l.
1 Repons
Dyagnostik
Pwoblèm nan se filtè WHERE transaction_date >= MAX(transaction_date) la. Paske w ap itilize >= (pa >), chak fwa modèl la kouri, li reprann tout ranje ki gen menm transaction_date ak MAX() ki deja egziste nan tab la, epi li enjekte yo ankò. Kòm unique_key='transaction_id' sipoze fè yon MERGE/UPSERT, sa dwe evite duplikasyon si konfigirasyon merge a byen fèt — men rezon prensipal duplicate yo se ke plizyè transaction_id diferan ka gen menm transaction_date (menm jou/timestamp), e lojik >= la ap re-selectionne yo epi enjekte yo kòm nouvo ranje si merge/unique_key la pa aplike kòrèkteman, oswa si gen plizyè ranje sous ki gen menm transaction_id deja depi nan sous done a.
Bagay ki dwe verifye/eseye
-
Verifye si gen duplicate deja nan sous la (
source('sales','transactions')) — si sous la deja gen plizyè liy pou menmtransaction_id,unique_keya dbt p ap ka rezoud sa san yon dedup anvan (ex:QUALIFY ROW_NUMBER() OVER (PARTITION BY transaction_id ORDER BY transaction_date DESC) = 1). -
Ranplase
>=ak>, oswa pi bon toujou, itilize yon apwòch ki mwens riske pou double-processing:
{% if is_incremental() %}
WHERE transaction_date > (
SELECT MAX(transaction_date)
FROM {{ this }}
)
{% endif %}
-
Konfime
incremental_strategy— sou Snowflake, si ou pa espesifyeincremental_strategy, dbt itilizemergepa default kòmunique_keyla defini, sa ki ta dwe fè yon upsert kòrèk. Men verifye nandbt debug/logs si strategy a se byenmergeepi keunique_keyla pa null nan okenn ranje (yontransaction_idNULL ka kreye pwoblèm nan MERGE la). -
Ajoute yon dedup nan modèl la anvan chaje kòm mezi sekirite, menm si sous done a ta sipoze gen valè inik:
{{ config(
materialized='incremental',
unique_key='transaction_id',
incremental_strategy='merge'
) }}
WITH source_data AS (
SELECT
transaction_id,
customer_id,
amount,
transaction_date,
ROW_NUMBER() OVER (
PARTITION BY transaction_id
ORDER BY transaction_date DESC
) AS rn
FROM {{ source('sales', 'transactions') }}
{% if is_incremental() %}
WHERE transaction_date > (SELECT MAX(transaction_date) FROM {{ this }})
{% endif %}
)
SELECT
transaction_id,
customer_id,
amount,
transaction_date
FROM source_data
WHERE rn = 1
Sa pou ou fè apre
- Kouri yon
SELECT transaction_id, COUNT(*) FROM {{ source('sales','transactions') }} GROUP BY 1 HAVING COUNT(*) > 1pou konfime si duplicate yo soti nan sous la oswa se rezilta filtè incremental la. - Si tab final la deja gen duplicate, fòk ou fè yon
dbt run --full-refreshapre ou fin korije lojik la, paske incremental merge a p ap otomatikman netwaye duplicate ki deja egziste.
Sa a se yon pwopozisyon — tanpri verifye rezilta requèt dyagnostik yo anvan ou aplike chanjman sa yo sou pwodiksyon.
Konekte pou di lòt moun si li te mache.
Mèsi anpil @Jean Pierre li mache kounya.
— Velou 2 days ago
Sign in and verify your email to post an answer.