Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
REPLACE WHERE akışları, tablo geçmişinizin tamamını yeniden işlemeden bağımsız bir akış tablosunun hedeflenen bir alt kümesini yeniden hesaplar ve üzerine yazar. Geç gelen verileri, üst akışta yeniden işlemeyi, şema evrimini ve geri doldurma işlemlerini yönetirler.
REPLACE WHERE akışında, hedef tabloda bir koşul tanımlarsınız. Koşulla eşleşen tüm satırlar silinir ve aynı koşul aralığı için kaynak sorgu yeniden değerlendirilerek değiştirilir. Koşulla eşleşmeyen satırlar değiştirilmeden bırakılır.
Gereksinimler
REPLACE WHERE akışları aşağıdaki gereksinimlere sahiptir:
- Databricks Unity Kataloğu ve sunucusuz işlem önerir. Artımlı yenileme yalnızca sunucusuz işlemde desteklenir.
REPLACE WHERE akışları ne zaman kullanılır?
Aşağıdaki senaryolar için REPLACE WHERE akışlarını kullanın:
- Akış semantiği olmadan artımlı toplu işleme: Filigranlar gibi akış kavramlarını yönetmeden yeni satırları toplu olarak işleyin.
- Seçmeli yeniden işleme: Yalnızca bir koşulla eşleşen satırları yeniden derlerken diğer tüm satırlara dokunulmaz.
-
Standart gerçekleştirilmiş görünüm özelliklerinin ötesindeki senaryolar:
- Kaynaktan daha uzun saklama süresine sahip tabloları hedefleme
- Boyut tablosu değiştiğinde yeniden derlemeyi engelleme
- Tüm geçmişi yeniden derlemeden şema evrimi
Bir REPLACE WHERE akışı oluşturun
FLOW REPLACE WHERE ile birlikte CREATE OR REFRESH STREAMING TABLE satır içi yan tümcesini kullanın:
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;
Yenileme sırasında, hedef tablodaki koşulla eşleşen tüm satırlar silinir, kaynak sorgu aynı koşul aralığı için yeniden derlenir ve yeni sonuçlar eklenir. Bu örnekte, son 7 güne ait tüm satırlar kaynak sorgu kullanılarak silinip orders_enriched yeniden derlenir.
Koşulu kaynak sorguya eklemeniz gerekmez. İşlem hattı motoru, kaynaktan okurken bunu otomatik olarak uygular.
Note
BY NAME gereklidir. Sütunların konumlarına göre değil, adlarıyla eşleştirilmesini sağlar.
Geçmiş verileri geri doldurma
Hedef tabloya zamanlanmış yenilemelerin dışında geçmiş veya düzeltilmiş satırlar yazmak için, geçmiş verilerin bulunduğu yere bağlı olarak iki mekanizma arasından seçim yapın:
-
Yüklem geçersiz kılmaları:
REFRESH STREAMING TABLE ... WHEREkullanarak tek seferlik bir yüklem aralığı için akışın kaynak sorgusunu yeniden çalıştırın. Geçmiş veriler artımlı veriyle aynı kaynaktan geldiğinde kullanın. - DML deyimleri: Akışı atlayarak hedef tabloya doğrudan ekleyin. Geçmiş veriler artımlı verilerden farklı bir kaynakta olduğunda kullanın.
Koşul geçersiz kılmaları
Tablo tanımını değiştirmeden, tek bir yenileme için akışın REPLACE WHERE koşulunu geçersiz kılın. Koşul geçersiz kılmaları tek seferliktir, yalnızca bu yenilemeye uygulanır ve sonraki zamanlanmış yenilemeleri etkilemez.
WHERE ile REFRESH STREAMING TABLE yan tümcesini kullanın:
REFRESH STREAMING TABLE orders_enriched WHERE date BETWEEN '2020-01-01' AND '2024-12-31';
Akış yalnızca geçersiz kılma predikatıyla eşleşen satırları siler ve bunları kaynaktan yeniden hesaplar. Akışın statik koşulu değiştirilmez, bu nedenle bir sonraki zamanlanmış yenileme özgün koşulu kullanır.
Geçersiz kılmayı SYNC veya ASYNC ile birleştirebilirsiniz. Örneğin, yenilemeyi arka planda başlatmak ve işlem hattı güncellemesine yönelik bir bağlantıyla hemen geri dönmek için:
REFRESH STREAMING TABLE orders_enriched WHERE date >= date_add(current_date(), -30) ASYNC;
Note
WHERE yan tümcesi yalnızca FLOW REPLACE WHERE yan tümcesiyle oluşturulmuş bir akış tablosunda desteklenir. Bunu diğer herhangi bir akış tablosunda belirtmek hata döndürür. bkz. REFRESH (MATERIALIZED VIEW veya STREAMING TABLE).
DML deyimleri
DML deyimlerini doğrudan hedef tabloda çalıştırarak akıştan farklı bir kaynaktan gelen satırları yükleyin:
INSERT INTO orders_enriched
SELECT *
FROM orders_enriched_legacy
WHERE date < '2025-01-01';
Tam yenileme davranışı
REPLACE WHERE akışının tam yenilenmesi, kaynak sorguyu yalnızca akışın tanımlı yüklemini kullanarak yeniden yürütür. Bu koşulla eşleşmeyen hedefteki her satırı, bu koşulun geçersiz kıldığı satırlar ve önceden tanımlanmış koşul aralığının dışında DML deyimleriyle eklenmiş satırlar dahil olmak üzere, kalıcı olarak siler.
Warning
Tam yenileme tüm mevcut verileri temizler ve akışı yalnızca tanımlanan koşulu kullanarak yeniden yürütür. Bir işlem hattı 7 günlük bir yüklemle bir yıldır çalışıyorsa, tam yenileme yapıldığında tablo yalnızca son 7 günlük verileri içerir. Tüm eski satırlar kalıcı olarak silinir.
REFRESH STREAMING TABLE orders_enriched FULL;
Tabloda tam yenilemeleri önlemek için tablo özelliğini pipelines.reset.allowed olarak falseayarlayın:
CREATE OR REFRESH STREAMING TABLE orders_enriched
TBLPROPERTIES (pipelines.reset.allowed = 'false')
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
...
Kademeli yenileme
REPLACE WHERE akışları, mümkün olduğunda artımlı yenileme kullanır; değiştirme penceresinin tamamını yeniden hesaplamak yerine, yalnızca son yenilemeden bu yana değişen kaynak verilerini yeniden işler. Artımlı yenileme sunucusuz işlem gerektirir.
Artımlı yenileme uygulandığında
Aşağıdakilerin tümü doğru olmalıdır:
- İşlem hattı sunucusuz işlem üzerinde çalışır.
- Sorgu şekli desteklenir. Desteklenen işleç kümesi için artımlı yenileme bölümüne bakın.
- Koşul, kaynak tablodan temel sütunlara başvurur. Toplama ya da pencere işlevi sonuçları gibi türetilmiş değerler üzerindeki koşullar bir veri kaynağına gönderilemez; bu da artımlı yenilemeyi devre dışı bırakır.
- Mevcut değiştirme penceresi içinde hiçbir satır dış DML tarafından değiştirilmemiştir. Geçerli pencerenin dışındaki satırları değiştiren DML etkilenmez.
- Geçerli değiştirme penceresi, önceki koşulun dışlandığı satırları içermiyor. Yüklemi daha önce işlenmemiş bir aralığı kapsayacak şekilde genişletirseniz, bu tek yenileme tam yeniden hesaplamaya döner. Sonraki yenilemeler tekrar artımlı yenileme için uygundur.
- Koşul belirleyicidir.
rand()gibi deterministik olmayan işlevler kullanan yüklemler artımlı yenilemeyi devre dışı bırakır. gibicurrent_date()zamana bağlı işlevlere izin verilir.
Herhangi bir akışın ilk yenilenmesi her zaman tam bir hesaplamadır. Herhangi bir koşul karşılanmazsa, bu yenileme geçerli değiştirme penceresinin tamamen yeniden hesaplanmasına başvurur.
Artımlı yenileme için en iyi yöntemler
REPLACE WHERE akışlarının artımlı yenileme için uygun kalması için bu yönergeleri izleyin.
Hareketli alt sınır kullanma
Hareketli bir alt sınıra sahip yüklemler, süresiz olarak artımlı yenileme için uygun kalır.
FLOW REPLACE WHERE date >= date_add(current_date(), -7)
date BETWEEN date_add(current_date(), -7) AND current_date() gibi hareketli bir üst sınır, pencereyi önceden hariç tutulan satırları kapsayacak şekilde kaydırarak tek seferlik bir tam yeniden hesaplamaya geri dönüşü tetikleyebilir.
Yüklem sütununu GROUP BY içine ekleyin.
Toplulaştırma yaparken, işleyicinin koşulu toplulaştırmanın altına itebilmesi için koşul sütununu GROUP BY içine ekleyin.
FLOW REPLACE WHERE date >= date_add(current_date(), -7) BY NAME
SELECT date, region, SUM(amount) AS total
FROM sales
GROUP BY date, region;
koşul sütununda eksikse GROUP BYkoşul toplamanın altına gönderilemez ve kaynak tam olarak taranır.
Birleştirme anahtarlarında koşul sütununu ekleme
İşleme motorunun birleştirilen tüm kaynakları eleyebilmesi için yüklem sütununu birleştirme koşuluna ekleyin.
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;
Birleştirilmiş bir tablo yüklem sütununu görünür kılmıyorsa, bu tablonun tamamı her yenilemede taranır.
Tam yeniden hesaplamaya geri dönüşü tanılama
Bir yenileme tam yeniden hesaplamaya geri düştüğünde, neden akışa yönelik planning_information olayında bildirilir. Bkz. İşlem hattı olay günlüklerini izleme. Aşağıdaki tabloda olayda bildirilen nedenler listelendi:
| Reason | Meaning |
|---|---|
EXTERNAL_CHANGE_IN_REPLACE_WINDOW |
Harici bir DML, geçerli değiştirme penceresindeki satırları değiştirdi. |
REPLACE_WHERE_NOT_DETERMINISTIC |
Koşul, belirleyici olmayan ifadeler kullanır. |
PRIOR_REPLACE_WHERE_NOT_DETERMINISTIC |
Önceki yenilemede belirleyici olmayan bir koşul kullanılmıştır. |
UNSUPPORTED_REPLACE_WHERE_PREDICATE |
Koşul herhangi bir kaynağa iletilemez, geçerli pencere önceki koşul tarafından işlenmeyen satırları içerir veya çalıştırma bir koşul geçersiz kılmasını kullanır. |
Examples
Aşağıdaki örneklerde yaygın REPLACE WHERE akış desenleri gösterilmektedir.
Örnek 1: Saklama süresi sınırlı olan bir kaynaktan geçmiş toplu verileri koruyun
Bu örnek, ham veriler kaynak tablodaki saklama süresi dolup tablodan çıksa bile (3 günlük saklama süresi), günlük toplamları süresiz olarak korur:
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;
Örnek 2: Boyut tablosu değiştiğinde yeniden derlemeyi engelleme
Bu örnek, boyut öznitelikleri değiştiğinde geçmiş olgu satırlarını değiştirmeden tutar:
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;
Kullanıcının bölgesi değişirse, yalnızca son satırlar yeniden derlenir. Geçmiş satırlar, oluşturuldukları anda geçerli olan bölge değerini korur.
Örnek 3: Tüm geçmişi yeniden derlemeden yeni ölçüm ekleme
Bu örnek, bir tablo tanımının nasıl geliştirileceğini ve yalnızca hedeflenen aralığın nasıl yedeklendiğini gösterir:
İlk tabloyu tanımlayın:
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;Sorguyu
uniq_userseklemek için güncelleştirin: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;7 günlük aralıktan daha eski satırlar,
NULLiçinuniq_usersiçerir.
Örnek 4: Geçmiş verilerin tamamını geriye dönük doldurmadan önce küçük bir pencere üzerinde yineleme yapın
Bu örnekte, tüm geçmiş aralığını işlemeden önce küçük bir veri penceresinde sorgu mantığının nasıl doğrulanması gösterilmektedir.
Ölçümleri doğrulamak ve daha düşük işlem maliyetleriyle iş mantığını yinelemek için kısa bir pencereyle başlayın:
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;
Kısa bir zaman aralığı, her yenilemede yalnızca son 7 günü yeniden hesaplar; bu nedenle tam kapsamlı bir geçmiş çalıştırması başlatmadan önce sorguyu gerektiği kadar revize edin.
Sorgu sonlandırıldıktan sonra, geçmiş aralığın tamamını doldurmak için DML kullanın:
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;