Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toky REPLACE WHERE znovu vypočítají a přepíšou vybranou podmnožinu samostatné tabulky datového proudu, aniž by bylo nutné znovu zpracovat celou historii tabulky. Zpracovávají opožděně doručená data, opakované zpracování upstreamových dat, evoluci schématu a zpětné doplnění dat.
S tokem REPLACE WHERE definujete predikát v cílové tabulce. Všechny řádky odpovídající predikátu se odstraní a nahradí opětovným vyhodnocením zdrojového dotazu pro stejnou oblast predikátu. Řádky, které neodpovídají predikátu, zůstanou nedotčené.
Requirements
Toky REPLACE WHERE mají následující požadavky:
- Databricks doporučuje Katalog Unity a bezserverové výpočetní prostředky. Přírůstková aktualizace se podporuje jenom na výpočetních prostředcích bez serveru.
Kdy použít toky typu REPLACE WHERE
Toky REPLACE WHERE použijte pro následující scénáře:
- Přírůstkové dávkové zpracování bez sémantiky streamování: Zpracování nových řádků v dávkách bez správy konceptů streamování, jako jsou vodoznaky.
- Selektivní opětovné zpracování: Znovu zkompilujte pouze řádky, které odpovídají predikátu, a přitom ponechejte všechny ostatní řádky nedotčené.
-
Scénáře nad rámec standardních materializovaných možností zobrazení:
- Cílové tabulky s delší dobou uchovávání než zdroj
- Zabránění přepočítání při změně tabulky dimenzí
- Vývoj schématu bez opětovného dokončování celé historie
Vytvoření toku REPLACE WHERE
Použijte klauzuli FLOW REPLACE WHERE přímo v řádku s CREATE OR REFRESH STREAMING TABLE:
CREATE OR REFRESH STREAMING TABLE orders_enriched
SCHEDULE EVERY 1 DAY
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
SELECT
o.order_id,
o.date,
o.region,
p.product_name,
o.qty,
o.price
FROM orders_fct o
JOIN product_dim p
ON o.product_id = p.product_id;
Během aktualizace se odstraní všechny řádky v cílové tabulce, které odpovídají predikátu, zdrojový dotaz se přepočítá pro stejnou oblast predikátu a vloží se nové výsledky. V tomto příkladu se všechny řádky z posledních 7 dnů odstraní orders_enriched a přepočítají pomocí zdrojového dotazu.
Do zdrojového dotazu nemusíte přidávat predikát. Modul pipeline jej při čtení ze zdroje automaticky použije.
Note
BY NAME je povinné. Zajišťuje, že sloupce se budou shodovat podle názvu, nikoli podle pozice.
Obnovení historických dat
Pokud chcete provést obnovení, spusťte příkazy DML přímo v cílové tabulce:
INSERT INTO orders_enriched
SELECT *
FROM orders_enriched_legacy
WHERE date < '2025-01-01';
Chování úplné aktualizace
Úplná aktualizace toku REPLACE WHERE znovu spustí zdrojový dotaz pouze pomocí aktuálního predikátu. Řádky vložené příkazy DML mimo aktuální rozsah predikátu jsou trvale odstraněny.
Výstraha
Úplná aktualizace vymaže všechna existující data a znovu spustí tok pouze pomocí definovaného predikátu. Pokud pipeline běží už rok se sedmidenním predikátem, úplná aktualizace způsobí, že tabulka obsahuje pouze data za posledních 7 dní. Všechny starší řádky se trvale odstraní.
REFRESH STREAMING TABLE orders_enriched FULL;
Pokud chcete zabránit úplným aktualizacím v tabulce, nastavte vlastnost pipelines.reset.allowed tabulky na false:
CREATE OR REFRESH STREAMING TABLE orders_enriched
TBLPROPERTIES (pipelines.reset.allowed = 'false')
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
...
Přírůstková aktualizace
Toky REPLACE WHERE používají přírůstkovou aktualizaci, pokud je to možné, znovu zpracovávají pouze zdrojová data, která se od poslední aktualizace změnila, a nekomputují celé okno nahrazení. Přírůstková aktualizace vyžaduje výpočetní prostředky bez serveru.
Kdy se použije přírůstková aktualizace
Musí být splněny všechny následující podmínky:
- Kanál běží na výpočetních prostředcích bez serveru.
- Obrazec dotazu je podporovaný. Viz Přírůstková aktualizace, kde najdete informace o podporované sadě operátorů.
- Predikát odkazuje na základní sloupce ze zdrojové tabulky. Predikáty na odvozených hodnotách, jako jsou výstupy agregace nebo funkce okna, nelze odeslat do zdroje, což zakáže přírůstkovou aktualizaci.
- V aktuálním okně nahrazení nebyly změněny žádné externí řádky DML. Objekt DML, který upravuje řádky mimo aktuální okno, není ovlivněn.
- Aktuální okno nahrazení neobsahuje řádky, které předchozí predikát vyloučil. Pokud rozšíříte predikát tak, aby pokrývala rozsah, který nebyl dříve zpracován, vrátí se tato aktualizace zpět k úplnému výpočtu. Další aktualizace lze znovu provádět jako přírůstkové.
- Predikát je deterministický. Predikáty používající nedeterministické funkce, jako je
rand(), zakazují přírůstkovou aktualizaci. Dočasné funkce, jakocurrent_date()jsou povolené.
První aktualizace jakéhokoli toku je vždy úplný výpočet. Pokud některá podmínka není splněná, vrátí se tato aktualizace zpět do úplného výpočtu aktuálního okna nahrazení.
Osvědčené postupy pro přírůstkovou aktualizaci
Postupujte podle těchto pokynů, aby toky REPLACE WHERE zůstaly způsobilé pro přírůstkovou aktualizaci.
Použijte pohyblivou dolní mez
Predikáty s pohyblivým dolním mezem zůstávají způsobilé pro přírůstkovou aktualizaci na neomezenou dobu.
FLOW REPLACE WHERE date >= date_add(current_date(), -7)
Posouvající se horní mez, například date BETWEEN date_add(current_date(), -7) AND current_date(), může posunout okno tak, aby zahrnovalo dříve vyloučené řádky, což vyvolá jednorázový návrat k úplnému přepočtu.
Zahrňte sloupec predikátů do GROUP BY
Při agregování zahrňte do
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
SELECT date, region, SUM(amount) AS total
FROM sales
GROUP BY date, region;
Pokud ve GROUP BY chybí sloupec predikátu, predikát nelze přesunout pod agregaci a zdroj se prochází celý.
Zahrnout sloupec s predikátem do klíčů spojení
Do podmínky spojení zahrňte sloupec predikátu, aby modul mohl odfiltrovat všechny připojené zdroje.
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
SELECT f.date, f.user_id, d.region, f.revenue
FROM fact f
JOIN dim d ON f.date = d.date AND f.user_id = d.user_id;
Pokud propojená tabulka nezpřístupňuje sloupec predikátu, je tato tabulka při každé aktualizaci prohledána v plném rozsahu.
Diagnostika přechodu na úplný přepočet
Když aktualizace přejde na úplný přepočet, důvod je uveden v události planning_information pro tok. Viz Sledování protokolů událostí kanálu. Následující tabulka uvádí důvody nahlášené v události:
| Reason | Význam |
|---|---|
EXTERNAL_CHANGE_IN_REPLACE_WINDOW |
Externí příkaz DML upravil řádky v aktuálním okně pro nahrazování. |
REPLACE_WHERE_NOT_DETERMINISTIC |
Predikát používá ne deterministické výrazy. |
PRIOR_REPLACE_WHERE_NOT_DETERMINISTIC |
Předchozí aktualizace používala ne deterministický predikát. |
UNSUPPORTED_REPLACE_WHERE_PREDICATE |
Predikát nelze použít na žádném zdroji, aktuální okno obsahuje řádky, které nebyly zpracovány předchozím predikátem, nebo běh používá přepsání predikátu. |
Příklady
Následující příklady ukazují běžné vzory toku REPLACE WHERE .
Příklad 1: Zachování historických agregací ze zdroje omezeného uchovávání
Tento příklad uchovává denní agregace po neomezeně dlouhou dobu, a to i poté, co jsou nezpracovaná data ze zdrojové tabulky odstraněna po uplynutí 3denní doby uchovávání:
CREATE OR REFRESH STREAMING TABLE events_agg
FLOW REPLACE WHERE date >= date_add(current_date(), -3) BY NAME
SELECT
date,
key,
SUM(val) AS agg
FROM events_raw
GROUP BY ALL;
Příklad 2: Zabránění přepočítaní, když se změní tabulka dimenzí
Tento příklad uchovává historické řádky faktů beze změny při změně atributů dimenzí:
CREATE OR REFRESH STREAMING TABLE fact_dim_join
FLOW REPLACE WHERE f.date >= date_add(current_date(), -1) BY NAME
SELECT
f.date,
f.user_id,
d.region,
f.revenue
FROM fact_table f
JOIN dim_users d
ON f.user_id = d.user_id;
Pokud se oblast uživatele změní, přepočítají se jenom poslední řádky. Historické řádky uchovávají hodnotu oblasti v době, kdy byly zapsány.
Příklad 3: Přidání nové metriky bez opětovného dokončování úplné historie
Tento příklad ukazuje, jak upravovat definici tabulky a zpětně doplnit data pouze pro vybraný rozsah:
Definujte počáteční tabulku:
CREATE OR REFRESH STREAMING TABLE clickstream_daily FLOW REPLACE WHERE event_date >= date_add(current_date(), -7) BY NAME SELECT event_date, page_id, COUNT(*) AS clicks FROM clickstream_raw GROUP BY ALL;Aktualizujte dotaz tak, aby přidal
uniq_users:CREATE OR REFRESH STREAMING TABLE clickstream_daily FLOW REPLACE WHERE event_date >= date_add(current_date(), -7) BY NAME SELECT event_date, page_id, COUNT(*) AS clicks, COUNT(DISTINCT user_id) AS uniq_users FROM clickstream_raw GROUP BY ALL;Řádky starší než sedmidenní období obsahují hodnotu
NULLprouniq_users.
Příklad 4: Iterujte nad malým časovým oknem před zpětným doplněním celé historie
Tento příklad ukazuje, jak před zpracováním úplného historického rozsahu ověřit logiku dotazu v malém okně dat.
Začněte krátkým oknem pro ověření metrik a iterací obchodní logiky s nižšími náklady na výpočetní prostředky:
CREATE OR REFRESH STREAMING TABLE revenue_attribution
FLOW REPLACE WHERE event_date >= date_add(current_date(), -7) BY NAME
SELECT
event_date,
campaign_id,
SUM(revenue) AS total_revenue
FROM marketing_events
GROUP BY ALL;
Krátké časové okno při každém obnovení přepočítá pouze posledních 7 dní, proto dotaz před spuštěním úplného historického běhu upravujte tolikrát, kolikrát je potřeba.
Po dokončení dotazu použijte DML k obnovení úplného historického rozsahu:
INSERT INTO revenue_attribution
SELECT
event_date,
campaign_id,
SUM(revenue) AS total_revenue
FROM marketing_events
WHERE event_date < date_add(current_date(), -7)
GROUP BY ALL;