Informatica Incremental Süreçlerin Yönetimi-2 (SCD Type-2 Version Column)

Merhabalar,

Önceki yazılarımda Informatica nedir, Informatica ile ETL nasıl geliştirilir gibi konulara değinmiştik. Sonrasında veri ambarı projelerinin vazgeçilmez unsuru olan Incremental sürecin ne olduğundan, Slowly Changin Dimension ın bu süreçlerde nasıl kullanıldığında, SCD type larından bahsetmiştik. SCD Type-1 ve Type-2 ile ilgili demo çalışmaları yapmıştık.

Bu yazımda Type-2 yi uygularken kullandığımız diğer bir yöntem olan Version Column yöntemini inceleyeceğiz.

Yapacaklarımızı kısaca özetlemek gerekirse, ilgili employee nin city bilgisi değiştiğinde her seferinde Flag imizi 1 artıracağız. Böylece max(Current_Flag_Number) a sahip satırlar en güncel verimiz olmuş olacak.

m_Load_TRG_Employee_Version_Number adında mapping oluşturuyorum.

Target tablomuzu bu örnek için kendimiz oluşturalım. Target Designer ekranına gelip, üst panelden Target >> Create diyoruz. TRG_Employee_Version olarak isimlendiriyorum target tablomu. Örneğimde, Oracle ı kullanacağım için Database type olarak Oracle seçiyorum. SQL kurulu ise makinenizde Microsoft SQL Server ı seçebilirsiniz..

version-3.PNG

Column tab ına geçip ihtiyaç duyduğum kolonları ekliyorum, data type larını değiştirip, Employee_PK yı Primary Key olarak belirtiyorum.

version-4.PNG

Generate and execute diyerek ilgili schema nın altında TRG_Employee_Version tablomu create etmiş oluyoruz.

Oluşturmuş olduğumuz target ı Source Analyzer tabından Source olarak ekliyoruz.

Mapping ekranına gelip source tablomuz olan Employees i (önceki örnekte tanımladığım) ve source olarak tanımladığım TRG_Employee_Version ı ekliyorum. Filter Transformation le Source portlarını SRC_, Target portalarını TRG_ ön ekleri isimlendirme standartlarıma uygun hale getiriyorum. Her iki tablonun datalarını  karşılaştırmak üzere Join Transformation ekliyorum. Buradaki amaç Target ve source umu EmployeeID alanlarıyla bağlayarak, source ta var olan dataların target ta olup olmadığı ya da güncellendiğini belirleyebilmek. Bu nedenle Master Outer Join kullanıyorum, Detail tablo olarak da Employee tablosunu seçiyoruz. Böylece Employee tablosuna left join yapmış oluyoruz. Condition tabından EmployeeId lere göre Join işlemimi yaptığımı belirtiyorum. Join transformation daki Join tiplerinin özelliklerini okumak isterseniz bir önceki makalemden inceleyebilirsiniz.

version-5.PNG

Join in sonuçlarını değerlendirmek üzere Expression Transformation ekliyorum.

Source tan gelen verilerin target ta olmayan bir kayıt mı yoksa zaten var olan ama update olmuş bir kayıt mı olduğu, Version kolonunun her update te 1 artarak ilerlemesi gibi koşulları oluşturabilmek için 4 yeni port ekliyorum.

version-6.PNG

New_Update_Condition: Bu portu verinin target ta var olup olmadığını işaretleyebilmek için oluşturuyorum. Temelde amacımız Join işlemi sonrası Target_Employee_ID null ise verinin target ta olmadığı bu nedenle insert etmek istediğimizi belirtmek için ‘I’, eğer Employee_ID ler eşleşiyor Firstname, Lastname, city, email alanlarından herhangi biri eşleşmiyorsa bu alanlardan biri ya da birkaçı update olmuş demektir, bu nedenle ‘U’ olarak işaretlemek. Veri insert ya da update olsa da veriyi insert edeceğiz bu örnek için ama flag update de 1 artarak ilerleyecek, insert te 1 olarak insert edilecek.  I ya U koşullarından herhangi birinin içerisinde olmayan bir kayıtta X olarak sonuç dönecektir. X ile karşılaşmamız bu port için oluşturduğumuz expression ı yazarken bazı noktaları kaçırdığımız anlamına gelmekte. Bu nedenle expressionımızı gözden geçirmekte fayda olacaktır.

version-7.PNG

Current_Date: Sysdate. Mapping çalışma zamanı yani sistem zamanını insert ederken kullanmak üzere oluşturduk. Veriyi target a insert ederken insert ve update date lerine bu tarihi insert edeceğiz.

New_Version: Yeni veri insert inde kullanmak üzere 1 olarak belirliyoruz.

Update_Version: Veri update olduğunda eski version ı 1 artırarak insert etmemiz için Version_Number+1 olarak belirliyoruz.

Insert ya da update koşullarında farklı koşullarda verileri insert edeceğimiz için 2 tane Filter Transformation ekliyorum.

Insert yanı I koşuluna uyan veri geldiğinde ilk defa Target a ekleneceği için Version_Column a New_Version u insert edeceğiz, U koşuluna uyan veri geldiğinde Update_Version u insert edeceğimiz için Filter Tarnsformation arasındaki tek fark bu iki port olmakta.

version-8.PNG

Insert Filter ın koşulu:

version-9.PNG

Update Filter ın Koşulu:

version-10.PNG

Böylece veriyi farklı pipeline lara bölerek her bir pipeline a farklı işlemler yaptırma imkanı elde etmiş olduk.

Veri iki pipeline da da insert edileceği için target ın giriş portlarıyla bağlıyorum. Veri insert koşuluna uyuyorsa yani Target ta olmayan bir veriyi insert edeceğimiz için New_Version u, Update koşuluna uyuyorsa Update_Version u insert edeceğimiz için iki pipeline ın farkı bu port lar olmakta.

version-11.PNG

Business Key im olan Employee_PK ı Sequence ile üretiyorum. Sequence in Nextval i ile Target ların Employee_PK larını bağlıyorum.

Mapping imi kaydedip Valid olup olmadığını kontrol ediyorum.

Target tablomda her bir Employee_Id ye ait Version_Column lardan bizim ilgilendiğimiz max olanı yani Employee_ID=1 kayıdının city si 10 kere değiştiyse en son güncel satırın Version_Number ı 11 olacaktır. Eğer veri tekrar güncellenirse 12,13,.. olarak ilerleyecektir. Bu nedenle her bir Employee nin max  Version_Column u bizim için önem arz etmekte. Her bir Employee nin max(Version_Colum) u select edebilmek için Target ın SQ sunun SQL Query sine aşağıdaki kodu yazıyorum:

version-12.PNG

Artık mapping imizi çalıştırabiliriz. Workflow Manager ı açıp New Mapping >> Session Task ekliyorum >> Mapping ten Source ve Target tablolarımın Schema larını belirtiyorum.

Workflow Monitor den baktığımda, 99 satır veri Target a insert edildiğini görebiliyorum.

Target tabloma baktığımda her bir kayıdın Version_Column un 1 olarak insert edildiğini görebilmekteyiz.

version-14.PNG

Source tablomda 86499 Id li Employee nin First_Name ini KEN olarak update ediyorum. Tekrar mapping imi çalıştırdığımda 1 satır verinin insert edildiğini görebiliyorum.

version-15.PNG

Target tabloma baktığımda KEN nin Version_Column un 2 olduğu görebiliriz.

version-16.PNG

Source ta aynı ID li Employee nin ismini Yusuf olarak update ediyorum tekrar.  Workflow umu çalıştırıyorum ve 1 satırın update pipeline ında işlendiğini görüyoruz.

Yusuf ismi ile eklenen Employee nin Version_Number ı 3 olarak insert edilmiş olduğu görebilmekteyiz.

version-17.PNG

Buraya kadar yaptıklarımızı özetlersek:

Amacımız TRG_Employee_Version tablomuzda Employee tablosunun tüm historisini tutmak, böyle bir employee nin ismi, city si değişse bile tüm değişimi kaydetmiş olacağız, yani full historiyi tutabileceğiz. Bunun için SCD Type-2 Version Column yöntemini kullanmaya karar verdik. Bu yöntemle veriyi ilk inser ederken 1 olarak Version_Column u belirliyoruz, sonrasında ilgili kayıdın her bir değişimi için önceki Version_Column u baz alıp 1 artırıyoruz. Böylece bizler için max(Version_Column) satırları en güncel datanın olduğu satırları getirmiş olacak.

Sonraki yazımda Date Range yöntemi ile SCD Type-2 yöntemini nasıl uyguladığımızı açıklamaya çalışacağı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. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: