PostgreSql ‘deki tabloların Azure Storage Container’a Partitionlanarak Parquet formatında aktarılması ve Synapse Clusterda oluşturulacak View’lar üzerinden Joinlenmesi.

Kerem NOGAY
4 min readFeb 15, 2023

--

Daha önce Azure üzerinde Spark kullanarak ve yüksek boyutlu dosyalardan faydalanarak çeşitli senaryolar üzerinde anlatımlar paylaşmıştım.

Bu anlatımda ise Postgre üzerindeki tabloların Synapse’de içeri alınarak View’lar ile joinlenmesi konularına değineceğim.

Bu senaryoda gerçek bir DWH tasarımı yapmadım ancak bir Fact ve bir adet Dim tablosu kullanarak oluşturduğumuz View’lerin nasıl External Table olarak yazdırıldığını ve tekrar kullanılabildiğini, Pipeline oluşturmayı ve parametrik yapılarla bu Pipeline’ları kullanmayı birlikte gerçekleştirmiş olacağız.

Öncelikle Source olarak kullanacağım Postgre bağlantısını Manage sekmesinden Linked Service olarak ekliyorum.

Eklediğim Linked Service bağlantısı ile bir Dataset yaratacağım burada parametrik olarak değerleri Pipeline’lar özelinde kullanmak istiyorum bu nedenle Dataset içerisinde gerekli parametreler tanımladım.

Daha sonra Parquet dosyalarını yazdırmak üzere Sink olarak Data Lake Gen2 Dataseti oluşturacağım ve burada tekrar parametrik olarak değişkenleri tanımlayacağım.

Daha sonra Dim tablosunu Copy Data Activity ile Container’a Parquet olarak yazdırıyorum. Burada Source ve Sinkte parametreleri tanımladım.

Debug diyerek çalıştırıyorum ve Container içerisinde yazdırdığım Parquet dosyasını görebiliyorum.

Şimdi Flights Fact tablosunu yazdıracağım. Burada Parquet dosyasını yazdırırken Partitionlayarak yazdırmak istiyorum.

Bunun için Lookup ekleyeceğim ve şimdilik bu örnek için tablodaki originairportid alanını kullanacağım.

Partition işlemini Spark ile de yapabilirdim buna daha önceki yazılarımda değinmiştim. Burada uyguladığım senaryoda Sparkpool oluşturmadan tek parça bir DB tablosunu Partitionlamak üzere denemeler yapmaya devam ediyorum.

First Row Only seçili olmamalı

Foreach Activity ekleyerek originairportid (veride tarih alanı olsaydı bunu da deneyebilirdik) alanında her satır için kayıtları Storage’a yazdırmaya çalışacağım.

ForEach içerisinde de Copy Activity ile id bazında gelen sonuçları yazdırmak istiyorum

Kurguladığım şekilde Pipeline içerisinde originairportid alanına göre partitionlayarak datayı ilgili klasör altında yazdırmış olduk.

İlgili klasör altında id bazında parquet dosyaları görülebiliyor

Şimdi Containera yazdırdığım Dim ve Fact tablolarından Sql Pool üzerinde View’lar oluşturarak Join yapacağım ve Resultset’i External Table olarak tekrar Parquet’e yazdırıp nihai bir View oluşturacağım.

Bunu yapmamın nedeni hali hazırda içeri aldığım Dim ve Fact tablolarını birbiri ile Joinledikten sonra uygun bir kullanım sağlamak olacak.

Container üzerindeki dosyalara erişmek veya External Table yazdırmak için Data Source tanımladım.

Buraya kadar yaptığım ayarların doğruluğunu teyit ederek ilerledim. Bundan sonraki adımlarda View’ları oluşturacağım

Oluşturduğum View’lari Joinleyerek kontrol edeceğim ardından bir External Table oluşturacağım.

External Table oluştururken ilk başta tanımladığım parametreler ile devam ediyorum ve bu yeni tabloda bir ID alanı oluşturuyorum.

Oluşturduğum External tabloyu Container altında ilgili klasörde görebiliyorum.

External Table’dan tekrar View oluşturarak ihtiyacım olan senaryolara göre bu View ile devam edebilirim.

View’i kontrol ettiğimde ID alanınında geldiğini teyit edebiliyorum.

Azure Synapse üzerinde genel olarak Pipeline oluşturmayı, Linked Service ve Datasource mantığını, View’lar üzerinde çalışmayı ve ek olarak External Table’larda dosya sisteminin nasıl yazıldığını görmüş olduk.

--

--