Informatica ile Incremental Süreçlerin Yönetimi-1

 

Merhabalar,

Bir önceki yazımda Informatica nedir, nasıl ETL geliştirilir gibi konuları incelemiştik. Bu yazımda dw projelerinin vazgeçilmez unsuru olan Incremental süreçlerden bahsedeceğim. Incremental süreçler uzun bir konu olduğu için bu yazı ile tamamlamayacağız konuyu.

İlk olarak Incremental süreçler nedir, neden ihtiyaç duyarız? 

Incremental adı üstünde kademeli olarak artan süreçlerin yönetimi. Şirketlerin bazı dataları incremental, bazılarının delete insert gibi farklı yöntemlerle bir yerden başka bir yere aktarılması gerekir. Çoğu şirkette farklı business lar için bu yöntemlerin tamamı uygulanır.

Örneğin, personel bilgilerinin tutulduğu bir tablonuz olduğunu düşünelim. Personelin telefon numarası değişirse eski numarasını tutmak anlamlı olmayacağı için numarayı update yaparsınız. Personelin çalıştığı şehir değişirse, yeni şehiri insert edip, eski şehirin eski olduğuna dair flag leme yaparsınız(insert-update). Bu flag leme farklı şekillerde olabilir. Bunu yeri geldiğinde inceleyeceğiz. Her gece personel tablosunun truncate insert ile de doldurabilirsiniz. Yani kısaca yöntem seçimi sizin business anlayışınıza ve ihtiyaçlarınıza göre değişecek bir durum.

Bu yazıda Incremental süreçlerin yönetimiyle ilgileneceğiz. Incremental aktarımda veri değişse de eski veri silinmez, yeni kayıtla birlikte db imizde kayıtlı olarak durur.

Yeni ve eski kayıtları birbirinden ayırt edebilmek için farklı yöntemler kullanabilirsiniz. TYPE 2 ile ilgili kısımda açıklayacağız bu yöntemleri. Tabi burada eski veriyi nasıl tutmak istediğimiz de önemli bir nokta. Tüm history i tutmak istiyor muyuz, yoksa belli bir kısmını mı? Bu konuyu birazdan irdeleyeceğiz.

Incremental süreç yönetimi için bir kaç yöntem var. Bunlardan başlıcaları:

  • SCD(Slowly Changing Dimension)
  • CDC(Change Data Capture)

Biz SCD ile incremental olarak datayı yüklemek üzerinde duracağız.

SCD ile datamızı yönetirken ihtiyaçlarımıza göre değişen çeşitler bulunmakta. Temelde en çok kullandığımız yöntemler SCD Type 1,SCD Type 2 ve SCD Type 3 olmakta. Şimdi bunları açıklayalım.

Type 1

Geçmiş dataya ait history tutmak istemiyorsanız kullanabilirsiniz, eski veriyi hiçbir şekilde analiz etmiyor, raporlarınızda görüntülemiyorsanuz kullanabilirsiniz. Yani ilgili satıra ait veri değiştiğinde eski veriyi update etmek istiyorsanız bu tip size göre.

Type 2

Yeni veri ile birlikte bu veriye ait geçmiş verileri de tutmak istiyorsanız kullanabilirsiniz. Geçmiş veriyi tutarken kullanabileceğimiz farklı yöntemler karşımıza çıkmakta.Bunlar:

  • Version Number: Full history i tutabiliriz bu yöntemle. Bir kolonda verinin geçerli olup olmadığına dair bilgileri tutarız(Version number column). Initial load da 1 vererek başlarız ve her data değişikliğinde version u 1 artırarak insert ederiz.
  • Flag MappingFull history i tutabiliriz bu yöntemle. Flag kolonunda verinin geçerli olup olamadığına dair bilgiyi tutarız. Initial load da veri geçerli olduğu için 1 olarak insert ederiz. Eğer ilgili satırın verisi değişirse eski satırın flag ini 0 olarak update eder, yeni satırın flag kolonunu 1 olarak insert ederiz. Yani where flag=1 koşulunun sağlayan satırlar geçerli satır olur.
  • Data Range Mapping: Full history i tutabiliriz bu yöntemle. Iki date tipindeki kolonda verinin geçerli olmaya başladığı tarihi(Start Date) ve geçerliliğini yitirdiği tarihi(End date) tutarız. Initial load da StartDate e 01.01.1900, EndDate e 01.01.9999 gibi başlangıç tarihi insert edip, veri güncellenirse StartDate i sysdate, EndDate i 01.01.9999 olarak insert edip, eski verinin EndDate ini sysdate-1 olarak update ederek bu süreci yönetebiliriz. Söylemiş olduğum 9999 gibi tarihler zorunluluk değil sizlerin tercihinize göre belirleyecebileceğiniz alanlar olmakta. Mutlaka bu şekilde sürecei yöneteceksiniz diye bir koşul yok, istediğiniz şekilde de yönetebilirsiniz. Kısaca bu yöntemde tarihler üzerinde değişiklikler yaparak verinin geçerli olduğu tarih aralığını tutuyoruz diyebiliriz.

Type 3

Historical datayı full değil de partial tutmak isterseniz bu yöntemi kullanabilirsiniz. 10 kere ilgili satırın değiştiğini düşünelim, siz sadece son iki değişimi tutmak isterseniz bu yöntemi kullanabilirsiniz. Son iki değişim sadece bir örnekti istediğiniz kadar historisini tutabilirsiniz. Örneğin, personel tablosundaki 123 nolu personelin çalıştığı şube 5 kere değiştiğini düşünelim. Bizim için önemli olan son 2 lokasyon bilgisi ise iki farklı lokasyon kolonunda bu verileri tutabiliriz. Eğer son 3 değişim önemli ise 3 kolon ile bu değişimi tutabiliriz. Önemli olan sizin ihtiyaçlarınız.

Demo ile anlattıklarımızı biraz daha kalıcı hale getirelim.

SCD Type-1 örneği yapalım. Kurgu olarak SCOTT schemasında DEPT tablosunu kullanalım. Buradaki DEPTNO ların karşısına gelen LOCATION bilgisi değiştiğinde eski Location bilgisi bizim için ihtiyaç duymayacağımız, anlam ifade etmeyen bir alan olduğu düşünelim. Bu nedenle veri güncellendikçe eski veriyi update etmek bizim ihtiyacımıza cevap verecektir.

Power Center ı açıyorum. Source umu Source Analyzer segmesine gelip, üst panelde Sources >> Import From Database den SCOTT schemasından DEPT tablosunu ekliyorum. (Önceki makalemde eklediğim için tekrar eklemiyorum source umu). Target Designer a gelip, üst panelden Target >> Import From Database diyerek SCOTT schemasından DEPT tablosunu ekliyorum. SCD1_DEPT olarak isimlendiriyorum. Target tabloyu SCOTT schemasının altında oluşturmak için Targets>>Generate and Execute SQL diyoruz.

scd_1_1

Mapping segmesine geçip ETL imi tasarlayabilirim. m_Load_SCD1_DEPT isminden mapping oluşturuyorum. Source ve target larımı sürükleyip bırakıyorum. Source ta source u uniq yapan alan yani business key DEPTNO olduğu için bu alan üzerinden source ve target ı karşılaştıracağım. Eğer ilgili DEPTNO target ta yoksa insert, varsa ve Location bilgisi değişmişse update yapılacak.

DEPTNO nun target ta olup olmadığını kontrol etmek için Lookup ı kullanacağım. Lookup kullanmadan source ve target ı join leyerek de bu işlemi yapabilirim. Her iki yöntemle işlemlerimizi yapacağız. İkisinin farkı ne derseniz, bazı mappinglerde performansları farklı olabilmekte. Lookup cache leyere işlem yapacağı için çok fazla verinin olduğu yerde cache yetersiz olabilir. Ayrıca veri çoksa cache lemek performans düşüklüğüne neden olabilir.

Lookup komponentini sürükleyip bırakıyorum.

scd_1_2

Hangi tabloyı lookup ile kontrol edeceğimizi söylememiz gerekiyor. Target tablomuz olan TRG_DEPT i seçiyoruz.SQ nun çıkış port larını lookup a sürükleyip bırakıyoruz.

scd_1_3

Lookup ın üzerine çift tıklayıp isimlendirmelerimizi daha anlamlı bir şekilde düzeltelim. SRC takısı ile source tan gelen port ları, TRG ile target tablomuzu isimlendirelim ve sondaki 1 leri kaldıralım.

scd_1_4

Hangi alan üzerinden veriyi kontrol edeceğimizi belirtmek için Condition tabından DEPTNO ları seçiyoruz.

scd_1_5.PNG

Her iki tabloyu DEPTNO lar üzerinden birleştirmiş oluyoruz.

Yapı şu hale gelmiş oldu:

scd_1_6.PNG

Eğer TRG_DEPTNO null ise veri yeni ve insert etmemiz gerektiği, eğer TRG_DEPTNO=SRC_DEPTNO ve SRC_LOCATION!=TRG_LOCATION ise LOCATION güncellenmiş demektir, yani update yapmamız gerektiği anlamına gelmekte. Örnek olması açısından sadece Location un değişimini inceliyoruz bu nedenle DEPTNO haricinde Location un değişimini izliyoruz. DNAME lerin değişimini de kontrol ediyor olsaydık Location la birlikte DNAME leri de kontrol ediyor olacaktık.

Bu koşulları tanımlayabilmemiz için Expression Task ekliyorum ve Lookup ın çıkış portlarını expression task a bağlıyorum. Target ın DNAME alanı benim için karar vermemde önem arz etmediği için bağlamıyorum.

scd_1_7.PNG

Expersion Task a çift tıklayıp Port tabına 2 yeni port ekliyorum. Bu port ların sadece çıkış portu olduğunu belirtmeyi unutmayın. Insert_data da verinin yeni veri olduğu bu nedenle insert koşulunu, Update_data da verinin zaten targetta olduğu bu nedenle update işlemi yapacağımı belirtmek için oluşturuyorum.

scd_1_8

Insert koşulunu yazacağım ekrana geçmek için Expression kolondaki oka tıklayıp Expression Editor segmesine geçiyorum.

IIF fonksiyonu ile TRG_DEPTNO boş ise 1 değilse 0 sonucunu döndür diyerek koşulumu oluşturuyorum.

scd_1_9

IIF fonksiyonu ile DEPTNO lar eşit, Location lar farklı ise update yapma koşulunu belirtmek için oluşturuyorum.

scd_1_10

 

Insert ve update olma koşullarında farklı işlemleri yapmak üzere yönlendirmek için iki tane Filter Transformation  ekliyorum. Insert ve update olarak isimlendiriyorum. Insert Filter Transformation ile yeni veri geldiğinde target tabloya ekleyeceğimiz için source tabloya ait tüm kolonları ve Insert_Data portunu Insert Filter Transformation a bağlıyoruz.

İlgili DEPTNO nun Location bilgisi update olmuşsa Target taki Location da update olacağı için TRG_DEPTNO, SRC_LOC, Update_Data portlarını Update Filter Transformation a bağlıyoruz.

scd_1_11.PNG

Insert Filter Tranformation a çift tıklayıp, hangi koşulu filtre olarak kabul edip, o koşula uyan verileri output portundan geçireceğini söylüyoruz. ‘1’ yapmamın nedeni expression transformation da Insert_Data portunu string olarak oluşturduğum için.

scd_1_13

Aynı şekilde Update Filter Transformation da da koşulu belirtip, buradan hangi dataların filtreleneceği belirtiyoruz.

scd_1_14.PNG

Insert koşulundan filtrelenen datalar insert olacağı için Target tablonun giriş portlarına bağlıyoruz.

Update koşulundan filtrelenenlerin update olacağını söylemek için Update Strategy Transformation ekliyoruz Mapping ekranına. Update Filter Transformation daki portları Update Strategy Transformation ın giriş portlarına bağlıyoruz. Update Strategy Transformation  i çeşitli işlemler yapmak için kullanıyoruz. Hangi işlemi yapacağımızı fonksiyonlarla belirterek yapıyoruz. Bu fonksiyonlar: DD_INSERT, DD_UPDATE, DD_DELETE, DD_REJECT. Ayrıntılarına sonra değineceğiz. Yapmak istediğimiz işlem update işlemi olduğu için Update Strategy Transformation a çift tıklayıp DD_UPDATE fonksiyonunu tanımlıyoruz ki update işlemi yapacağımızı belirtelim.

scd_1_16.PNG

Update Strategy Transformation in çıkış portunu copy paste ile eklemiş olduğumuz target ın ilgili portlarına bağlıyoruz. Update i target ın business key ine göre yapacağımız için target ın business key ile bağlantı kurduğumuzu belirtmekte yarar görüyorum.

scd_1_15.PNG

Mappingimizi kaydedip valid olduğundan emin olalım. Daha sonra Workflow Manager a gelip mappingimizi çalıştırmak için gerekli ayarlamaları yapalım. Mappingin nasıl çalıştırılacağını önceki yazımda anlatmış olduğum için tekrar ayrıntılı bir şekilde anlatmıyorum. Önceki yazıma şuradan erişebilirsiniz.

Workflow u çalıştırıyorum. Source taki 4 satır veri target a aktarılıyor. scd_1_17.PNG

Source taki New York u Turkey olarak update ediyorum. Tekrar workflow u çalıştırıyorum. Bir satır veri update portuna aktarılıyor. Target a baktığımızda New York un Turkey olarak update edildiğini görebiliriz.

scd_1_18.PNG

Bu yazımda Incremental süreç nedir, SCD type ları gibi konulara değinmeye çalıştım. SCD Type -1 ile ilgili örnek çalışma yaptık. Bu şekilde verilerinizin değişimine dair history tutmak istemiyorsanız Type-1 size göre diyebiliriz.

Bundan sonraki yazımda SCD Type-2 ye değiniyor olacağım.

Keyifli okumalar…

Şeydanur Sandıkçı

Reklamlar

Etiketler:, , , , , , , , , , , , , , ,

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: