Impala Bölüm 8: Join

Cloudera Impala
Okunma süresi: 4 dakika

Impala, Hive’a göre join konusunda biraz daha geniş bir desteğe sahiptir. Fakat unutmamak lazım ki join işlemleri performans sorunlarına yol açacaktır, bu sebeple yapınızı minimal join ihtiyaçlarına göre tasarlamanız yerinde olacaktır. Impala’da ilişkisel veritabanlarında olduğu gibi sütun eşleştirmesi temelinde bir join yapısı mevcuttur.

Inner Join

Seçilen tabloların kesişim kümesini getirir, yani sadece eşleşen kayıtlar gelir. Örnek olarak t1 ve t2 tablolarımız olsun, bunları inner join ile bağlayalım.

veya

İlişkisel veritabanlarından da alışkın olduğumuz gibi ilk tablo FROM ifadesinden sonra yazıldı, JOIN ifadesinden sonra bağlamak istediğimiz ikinci tablomuzu yazdık ve ON ifadesinden sonra tabloların hangi sütunları aracılığıyla birleştirileceğini belirtmiş olduk.

Elbette bu işlemi ikiden fazla tablo için de uygulayabiliriz:

Outer Join

Outer join 3 türlüdür: left, right ve full. Bir join ifadesinde FROM ifadesinden sonra yazdığımız ilk tablo left yani sol, JOIN ifadesinden sonra yazdığımız ikinci tablo ise right yani sağdaki tabloyu gösterir.

Left outer join’de temelde bizim için soldaki tablonun yani birinci tablonun önemli olduğunu, burada verileri ne olursa olsun getirmesini istediğimizi belirtmiş oluyoruz. Sağdaki tablodan ise sadece kesişenler getirilir. Örnek kullanımı şöyledir:

Right outer join’de temelde bizim için sağdaki tablonun yani ikinci tablonun önemli olduğunu, burada verileri ne olursa olsun getirmesini istediğimizi belirtmiş oluyoruz. Soldaki tablodan ise sadece kesişenler getirilir. Örnek kullanımı şöyledir:

Full outer join ise left ve right outer joinlerin birleşimidir. Yani tüm verileri listeler, kesişim olmayanlar null olarak gözükür. Örnek kullanımı şöyledir:

Self Join

Impala’da bir tabloyu yine kendisi ile join’leyebilirsiniz. Örneğin:

Semi Join

Pek kullanılmayan bir join türüdür, pratikte kullanacağınız bir yer çıkar mı bilemedim, en azından benim için pek ihtiyaç olmadığını söyleyebilirim. Left ve Right olarak iki türü vardır. Temelde Semi Join, tablolardaki eşleşme durumlarında sadece ilk kayıtları alır, sonra bir sonraki eşleşme aranır.

Left Semi Join’de sağdaki tablomuzda eşleşen kayıtları bulunan soldaki tablonun kayıtlarını döndürür. Right Semi Join’de tam tersi elbette. Unutmamanız gereken tüm eşleşen satırları değil yalnızca ilk kayıtları döndürüyor olmasıdır.

Left örneği:

Right örneği:

Anti Join

Impala 2’de ilk defa gelen bir özellik oldu. Left ve Right olarak iki türü vardır. Temelde yaptığı şey kesişmeyen kayıtların getirilmesidir. Yani Not Exists komutunun benzeri bir işlevi vardır.

Left Anti Join, sağdaki tablo ile eşleşmeyen soldaki tablonun kayıtlarını getirir. Right Anti join ise soldaki tablo ile eşleşmeyen sağdaki tablonun kayıtlarını getirir.

Left örneği:

Right örneği:

Cross Join

Cross Join temelde kartezyen çarpımı şeklinde çıktı üretmek için kullanılır. Örneğin iki tablomuz olsun ve her iki tabloda bulunan değerler her bir kayıt için çoğaltılsın istiyorsak kullanabileceğimiz bir yapıdır.

Büyük boyutlu tablolarda ciddi problemler yaratacağı için küçük boyutlu tablolarda yapmanız tavsiye edilir. En iyisi hiç bulaşmamaktır; ama bilgi olarak elinizde bulunsun diye paylaşayım dedim.

Bunu örneklendirerek açıklarsam daha akılda kalıcı olacaktır. Şimdi bir okul yapısı düşünelim, elimizde öğrenci tablomuz ve dersler tablomuz olsun.

ogrenciler
ogrno adi
1254 Ali Veli
1255 Ahmet Mehmet

 

dersler
derskodu dersadi
101 Fizik
102 Matematik
103 Calculus

 

Şimdi her bir öğrenci için dersleri göstermiş olalım:

Çıktımız şu şekilde olacaktır:

adi dersadi
Ali Veli Fizik
Ali Veli Matematik
Ali Veli Calculus
Ahmet Mehmet Fizik
Ahmet Mehmet Matematik
Ahmet Mehmet Calculus

 

Join Optimizasyonu

Join içeren sorgular performans konusunda en titiz davranılması gereken sorgu türleridir. Çünkü, yapılacak işlemlerde üretilecek result set boyutu, join’deki tabloların satır sayısının çarpımına ulaşacaktır. Oldukça büyük boyutlu (milyarlarca kayıt içeren) tablolarla uğraştığımızı düşündüğümüzde bu durumun ne kadar önemli olduğunu tahmin edersiniz.

İlk kural filtre yapmadan join işlemi yapmamaktır. WHERE ifadesi ile filtrelemediğimiz durumda tüm tablo taranacağı için bunun performansa olumsuz etkisi olacaktır. Ayrıca verilerin boyutları sunucuların üzerindeki ram miktarını aşması durumunda Impala sorgunuzu yürütmeyi durduracaktır. Her ne kadar büyük boyutlu verileri işlemek için kullanabiliyorsak ta daha önce de değindiğimiz gibi işlemlerin çoğu ram üzerinde gerçekleşiyor ve bu sebeple yapacağınız işlem, Impala kaynaklarını aşacak durumda olursa, sorgu işletilmeden iptal edilir.

Bir sonraki önemli kural istatistiklerin hesaplanmasıdır. İstatistikler özellikle sorguların planlanmasında önemli bir yer tutmaktadır. İlerleyen kısımda bu konuyu detaylı göreceğiz, o yüzden burada detaylarına girmeyeceğim; ama istatistikler toplanmadıysa Impala bunu sıfır boyutlu (zero-szie) bir tablo olarak kabul eder ve bu tabloyu sağdaki tablo olarak değerlendirme eğilimdedir.

Eğer tablolarda istatistikler toplanmadıysa, o zaman Impala joinlenmiş tablolarda yeniden bir düzenleme işlemi yapacaktır, bu da sorgu süresinin fazlasıyla uzamasına neden olacaktır. Böyle bir durumda geçici bir çözüm olarak STRAIGHT_JOIN’i kullanabilirsiniz.

STRAIGHT_JOIN ifadesini SELECT, DISTINCT, ALL ifadelerinden hemen sonra belirtilir ve join’lenmiş tablolardaki yeniden düzenlenmesi işlemlerini devre dışı bırakır. Bu durumda büyük boyutlu olan tablo ilk sırada yani left olarak verilirse daha performanslı bir sonuç alınacaktır. Her zaman left olarak belirtilen tablonun en büyük boyutlu olan olması önerilir. Örnek kullanımı şöyledir:

Join Stratejileri

Bir join işlemi yürütüldüğünde Impala iki tip strateji izler. Bunlar:

Broadcast

Bu stratejiye göre Impala left tabloyu okur ve ram’e alır, right tabloyu da join işlemine dahil edilen daemon’lara gönderir. Bu durum elbette ağ trafiğini artıracaktır. Bu sebeple right tablonun ufak boyutlu olması önemlidir. Tablo için istatistikler güncel değilse, default olarak Broadcast stratejisi uygulanır.

Shuffle

Partitioned tekniği olarak ta bilinir. Buradaki partition, tablonun partition olup olmaması ile ilgili değildir, karıştırılmaması önemlidir. Zira partition oluşturulmuş tablo için bu strateji uygulanmaz! Shuffle’da hash algoritması kullanarak karşılıklı gelen satırları her iki tablodan bölen ve satırların alt kümelerini işlenmek üzere diğer node’lara gönderen “partition” tekniğini kullanmasını sağlar.

Join işleminde kullandığınız tablolar birbirine yakın boyutta tablolar ise Shuffle’ın kullanılması doğrudur. Eğer bir tablo büyük, diğeri küçük ise Broadcast’in kullanması daha uygun olur.

Eğer tablo istastikleri hesaplanmadıysa veya güncel değilse, Impala öncelikle Broadcast seçme eğilimindedir. Bu gibi durumlarda sorgu EXPALIN ile bakılarak incelenir ve uygun olan stratejiyi manuel olarak verebiliriz. EXPLAIN konusunu ayrıca inceleyeceğimiz için burada detayına girmeyeceğim.

Sorguda kullanılırken /* +BROADCAST|SHUFFLE */ şeklinde kullanılır. Örnek kullanım:

veya

 

0
0

Veri Bilimci Yetiştirme Programı

Her yerde geçerli @datasciencearth sertifikası

Bu program ülkemizde büyük işgücü açığı bulunan Veri Bilimi konusunda çalışabilecek yeterliliklerde Veri Bilimciler yetiştirmek için kurgulanmıştır.

Ücretli ve Ücretsiz Eğitimler

Türkiye'nin en büyük veri bilimi topluluğu ile kariyerinizi inşa edin.

Gruplarımıza katılın!

Data Science Earth

Data Science Earth ekibi, üst düzey Veri Bilim çözümleri üretmek amacı ile toplanmış akademisyenler ve uzmanlardan oluşmaktadır. Öncelikli olarak veri bilincini geliştirmeyi ve küreselleşen rekabet ortamında verinin gücünün doğru kullanılmasını sağlamayı amaçlamaktadır.

Sponsor

QuestionPro 35 farklı soru seçim özelliği ile anket çalışmalarımıza güç katmaktadır.