Örneklerle Hive Katılımı ve Alt Sorgu Eğitimi

⚡ Akıllı Özet

Hive'da birleştirme işlemleri, iki veya daha fazla tablodan satırları eşleşen bir sütun üzerinden birleştirir ve alt sorgular bir sorguyu diğerinin içine yerleştirir; bu nedenle her ikisi de burada düz metin dosyalarından yüklenen iki örnek tabloda gösterilmiştir.

  • 🧱 İki örnek tablo: sample_joins müşteri bilgilerini, sample_joins1 ise sipariş bilgilerini içerir ve her ikisi de ortak Id sütunu üzerinden birleştirilmiştir.
  • 🔗 Dört birleştirme türü: İç birleştirme, sol dış birleştirme, sağ dış birleştirme ve tam dış birleştirme, her biri farklı bir eşleşmeyen satır kümesini korur.
  • NULL boşluğu işaretler: Dış birleştirme, eşleşme olmasa bile bir satır döndürür ve eksik taraftaki her sütunu NULL ile doldurur.
  • 🔁 Sıra önemlidir: Birleştirmeler değişme özelliğine sahip değildir ve sol-birleşme özelliğine sahiptir, bu nedenle yer değiştirme işlemi yapılır.ping Tablolar, dış birleştirme sonucunu değiştirir.
  • 🧮 Alt sorgular sorguların iç içe geçmesidir: Alt sorgu, FROM veya WHERE yan tümcesinde yazılır ve dış sorgu, bu alt sorgunun döndürdüğü değere bağlıdır.
  • 📜 TRANSFORM aşağıdaki komut dosyalarını içerir: Özel map ve reduce komut dosyaları, yerleşik bir fonksiyon uygun olmadığında TRANSFORM yan tümcesi üzerinden çalıştırılır.

Hive'da join ve subquery örnekleri

Sorgulara katıl

Birleştirme sorguları, mevcut iki tablo üzerinde gerçekleştirilebilir. kovanBirleştirme kavramlarını daha net anlamak için burada iki tablo oluşturuyoruz:

  • örnek birleştirmeler (müşteri detaylarıyla ilgili)
  • sample_joins1 (çalışanlar tarafından verilen sipariş detaylarıyla ilgili)

) 1 Adım Çalışanların Id, Name, Age, address ve salary sütun adlarını içeren “sample_joins” tablosunun oluşturulması. Aşağıdaki ekran görüntüsü, CREATE TABLE ifadesini ve onayını göstermektedir.

Hive'da sample_joins müşteri tablosu için CREATE TABLE ifadesi

) 2 Adım Verilerin yüklenmesi ve görüntülenmesi. Sonraki ekran görüntüsü, yükleme komutunu ve ardından tablonun içeriğini göstermektedir.

Customers.txt dosyasını sample_joins'e yüklüyor ve yüklenen satırları görüntülüyor.

Yukarıdaki ekran görüntüsünden:

  1. Customers.txt dosyasından sample_joins dosyasına veri yükleniyor
  2. sample_joins tablosu içerikleri görüntüleniyor

) 3 Adım Aşağıdaki ekran görüntüsünde gösterildiği gibi, sample_joins1 tablosunun oluşturulması, ardından verilerinin yüklenmesi ve görüntülenmesi.

sample_joins1'i oluşturma, orders.txt dosyasını yükleme ve sipariş satırlarını görüntüleme

Yukarıdaki ekran görüntüsünden şunları gözlemleyebiliriz:

  1. Orderid, Date1, Id ve Amount sütunlarını içeren sample_joins1 tablosunun oluşturulması.
  2. Siparişler.txt dosyasından sample_joins1 dosyasına veri yükleniyor
  3. sample_joins1'de bulunan kayıtlar görüntüleniyor

İlerleyen bölümlerde, oluşturduğumuz tablolarda gerçekleştirilebilecek farklı birleştirme türlerini göreceğiz. Bundan önce, birleştirmelerle ilgili aşağıdaki noktalara dikkat etmeniz gerekiyor.

Birleştirmelerde dikkat edilmesi gereken bazı noktalar:

  • Birleştirmelerde yalnızca eşitlik birleştirmelerine izin verilir.
  • Aynı sorguda ikiden fazla tablo birleştirilebilir
  • LEFT, RIGHT ve FULL OUTER birleştirmeleri, eşleşme bulunmayan ON maddesi üzerinde daha fazla kontrol sağlamak amacıyla mevcuttur.
  • Birleştirmeler değişme özelliğine sahip değildir.
  • Birleşimler, LEFT veya RIGHT birleşimleri olup olmadığına bakılmaksızın sol ilişkiseldir

Eşitlik kısıtlaması, Hive'ın uzun yıllar boyunca olduğu halini yansıtmaktadır. Hive 2.2.0'dan itibaren, ON maddesindeki karmaşık ifadeler desteklenmektedir (HIVE-15211), bu nedenle mevcut bir sürümde eşitlik dışı bir koşul kabul edilmektedir. Daha eski sürümlerde, koşulun bir eşitlik testi olması gerekir ve diğer her şey WHERE maddesine taşınmıştır.

Farklı türde birleştirmeler

Bağlantıların 4 çeşidi vardır. Bunlar şunlardır:

  • İç birleşim
  • Sol dış katılma
  • Sağ dış birleşim
  • Tam dış birleştirme

Her tür, aynı iki tablo üzerinde aşağıda gösterilmiştir; bu nedenle örnekler arasında değişen tek şey, eşleşmeyen satırların hangilerinin kaldığıdır.

İç birleşim

Bu iç birleştirme işlemiyle her iki tabloda da ortak olan kayıtlar alınacaktır. Aşağıdaki ekran görüntüsündeki sonuç, yalnızca siparişi eşleşen müşterileri içermektedir.

Hive iç birleştirme çıktısı, yalnızca eşleşen siparişe sahip müşterileri gösteriyor.

Yukarıdaki ekran görüntüsünden şunları gözlemleyebiliriz:

  1. Burada, sample_joins ve sample_joins1 tabloları arasında JOIN anahtar kelimesini kullanarak, eşleşme koşulu (c.Id = o.Id) ile bir birleştirme sorgusu gerçekleştiriyoruz.
  2. Çıktı, sorguda belirtilen koşul kontrol edilerek seçilen ve her iki tabloda da ortak olan kayıtları görüntüler.

Sorgu:

SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);

Sol dış katılma

  • HiveQL LEFT OUTER JOIN, sağ tabloda eşleşme olmasa bile sol tablodaki tüm satırları döndürür.
  • Eğer ON koşulu sağ tabloda sıfır kayıtla eşleşirse, birleştirme işlemi yine de sağ tablodaki her sütunda NULL değeri içeren bir kayıt döndürür.

Aşağıdaki ekran görüntüsünde, siparişi olmayanlar da dahil olmak üzere tüm müşterilerin göründüğü yer almaktadır.

Hive sol dış birleştirme çıktısında siparişi olmayan müşteriler için NULL değerler bulunmaktadır.

Yukarıdaki ekran görüntüsünden şunları gözlemleyebiliriz:

  1. Burada, sample_joins ve sample_joins1 tabloları arasında “LEFT OUTER JOIN” anahtar kelimesini kullanarak, eşleşme koşulu (c.Id = o.Id) ile bir birleştirme sorgusu gerçekleştiriyoruz. Örneğin, burada referans olarak çalışan kimliğini kullanıyoruz; bu, kimliğin hem sağ tabloda hem de sol tabloda ortak olup olmadığını kontrol eder. Bu, eşleşme koşulu görevi görür.
  2. Çıktı, sorguda belirtilen koşula göre seçilen kayıtları gösterir. Yukarıdaki çıktıda NULL değerleri, sağdaki tablodan (yani sample_joins1) hiçbir değer içermeyen sütunlardır.

Sorgu:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Sağ Dış Birleştirme

  • HiveQL'de RIGHT OUTER JOIN, sol tabloda eşleşme olmasa bile sağ tablodaki tüm satırları döndürür.
  • ON koşulu sol tabloda sıfır kayıtla eşleşirse, birleştirme işlemi yine de sonuçta sol tablodaki her sütunda NULL değeri bulunan bir kayıt döndürür.
  • RIGHT JOIN işlemleri her zaman sağ tablodan kayıtları ve sol tablodan eşleşen kayıtları döndürür. Eğer sol tabloda ilgili sütuna karşılık gelen bir değer yoksa, o yerde NULL değerleri döndürülür.

Aşağıdaki ekran görüntüsü, önceki sonucun ayna görüntüsünü göstermektedir: eşleşen veya eşleşmeyen tüm siparişler görünmektedir.

Hive sağ dış birleştirme çıktısı keeping sample_joins1'den gelen her sipariş satırı

Yukarıdaki ekran görüntüsünden şunları gözlemleyebiliriz:

  1. Burada, sample_joins ve sample_joins1 tabloları arasında "RIGHT OUTER JOIN" anahtar kelimesini kullanarak ve eşleşme koşulu (c.Id = o.Id) ile bir birleştirme sorgusu gerçekleştiriyoruz.
  2. Çıktı, sorguda belirtilen koşulu kontrol ederek seçilen kayıtları görüntüler.

Sorgu:

  SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Tam Dış Birleştirme

Bu işlem, sorguda verilen JOIN koşuluna bağlı olarak sample_joins ve sample_joins1 tablolarının kayıtlarını birleştirir.

Aşağıdaki ekran görüntüsünde de görüldüğü gibi, her iki tablodaki tüm kayıtları döndürür ve her iki tarafta da eşleşen değerleri eksik olan sütunlar için NULL değerleri doldurur.

Hive tam dış birleştirme çıktısı, her iki tablodaki eşleşmeyen satırları birleştiriyor.

Yukarıdaki ekran görüntüsünden şunları gözlemleyebiliriz:

  1. Burada, sample_joins ve sample_joins1 tabloları arasında "FULL OUTER JOIN" anahtar kelimesini kullanarak ve eşleşme koşulu (c.Id = o.Id) ile bir birleştirme sorgusu gerçekleştiriyoruz.
  2. Çıktı, sorguda belirtilen koşul kontrol edilerek seçilen, her iki tabloda da bulunan tüm kayıtları görüntüler. Çıktıdaki NULL değerleri, her iki tablonun sütunlarında eksik değerleri gösterir.

Sorgu:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

Alt sorgular

Birleştirmeler tabloları yan yana getirir. Alt sorgu ise farklı bir şey yapar: bir sorguyu diğerinin içine yerleştirir, böylece dış sorgu önceden hesaplanmış bir sonuçtan yola çıkarak çalışabilir.

Bir sorgunun içinde yer alan sorguya alt sorgu denir. Ana sorgu, alt sorgunun döndürdüğü değerlere bağlı olacaktır.

Alt sorgular iki türe ayrılabilir:

  • FROM yan tümcesindeki alt sorgular
  • WHERE yan tümcesindeki alt sorgular

Ne zaman kullanmalı:

  • Farklı tablolardaki iki sütun değerinden birleştirilmiş belirli bir değer elde etmek için
  • Bir tablonun değerlerinin diğer tablolara bağımlılığı
  • Bir sütunun değerlerinin diğer tablolardaki değerlerle karşılaştırmalı olarak kontrol edilmesi.

Sözdizimi:

Subquery in FROM clause
SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main >
Subquery in WHERE clause
SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);

Örnek:

SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2

Burada t1 ve t2 tablo adlarıdır. İçteki ifade, t1 tablosunda gerçekleştirilen alt sorgudur. Burada a ve b, alt sorguya eklenen ve col1'e atanan sütunlardır. Col1, ana tabloda bulunan sütun değeridir. Alt sorguda bulunan bu "col1" sütunu, ana tablodaki col1 sütunundaki sorguya eşdeğerdir.

Özel komut dosyalarını yerleştirme

Bir alt sorgu verileri yalnızca HiveQL kullanarak yeniden şekillendirirken, gömülü bir komut dosyası satırları Hive dışında yazılmış koda iletir.

Hive, istemci gereksinimleri için kullanıcıya özel komut dosyaları yazmayı mümkün kılar. Kullanıcılar, bu gereksinimler için kendi map ve reduce komut dosyalarını yazabilirler. Bunlara gömülü özel komut dosyaları denir. Kodlama mantığı özel komut dosyasında tanımlanır ve bu komut dosyasını ETL aşamasında kullanabiliriz.

Gömülü komut dosyalarını ne zaman seçmelisiniz:

  • Müşteriye özgü gereksinimler nedeniyle geliştiricilerin Hive'da komut dosyaları yazıp dağıtması gerektiği durumlarda
  • Hive'ın yerleşik işlevlerinin belirli alan gereksinimleri için işe yaramayacağı durumlarda

Bunun için Hive, hem map hem de reducer komut dosyalarını yerleştirmek üzere TRANSFORM yan tümcesini kullanır.

Bu gömülü özel komut dosyalarında aşağıdaki noktalara dikkat etmeliyiz:

  • Sütunlar, kullanıcı komut dosyasına verilmeden önce dizeye dönüştürülecek ve TAB karakteriyle ayrılacaktır.
  • Kullanıcı komut dosyasının standart çıktısı, sekme ile ayrılmış dize sütunları olarak işlenecektir.

Örnek gömülü komut dosyası:

FROM (
	FROM pv_users
	MAP pv_users.userid, pv_users.date
	USING 'map_script'
	AS dt, uid
	CLUSTER BY dt) map_output

INSERT OVERWRITE TABLE pv_users_reduced
	REDUCE map_output.dt, map_output.uid
	USING 'reduce_script'
	AS date, count;

Yukarıdaki koddan şunları gözlemleyebiliriz. Bu sadece anlaşılması için örnek bir koddur.

  • pv_users, map_script'te belirtildiği gibi userid ve date gibi alanları içeren kullanıcılar tablosudur.
  • Reducer komut dosyası, pv_users tablosunun tarihine ve sayısına göre tanımlanmıştır.

SSS

Tarihsel olarak hayır. Hive 2.2.0'dan itibaren ON maddesinde karmaşık ifadeler kullanılabiliyor (HIVE-15211), bu nedenle eşitsizlik ve aralık koşulları çalışıyor. Daha önceki sürümlerde ON maddesi bir eşitlik testi olmalı ve diğer tüm koşullar WHERE ifadesine ait olmalıdır.

Bir harita birleştirmesi, daha küçük tabloyu belleğe yükler ve indirgeme aşamasını tamamen atlar. Hive, hive.auto.convert.join true olduğunda ve tablo yapılandırılmış boyut eşiğine uyduğunda bunu otomatik olarak seçer; bu da küçükten büyüğe birleştirmeleri çok daha hızlı hale getirir.

Bu sorgu, soldaki tablodan sağdaki tabloda en az bir eşleşmesi olan satırları, yineleme yapmadan ve sağ taraftaki sütunları döndürmeden döndürür. Sağdaki tabloya yalnızca ON yan tümcesinde başvurulabilir, SELECT veya WHERE yan tümcelerinde başvurulamaz.

Kısmen. Hive 0.13'ten itibaren IN, NOT IN, EXISTS ve NOT EXISTS operatörleri, ilişkili olanlar da dahil olmak üzere WHERE yan tümcesinde alt sorguları kabul eder. Kısıtlamalar devam ettiğinden, desteklenmeyen bir ilişki genellikle bir birleştirme (join) olarak yeniden yazılır.

İç içe sorgu türetilmiş bir tablo haline gelir ve her tablonun sütunlarına referans verilebilmesi için önce bir isme ihtiyacı vardır. Bu nedenle örnek, kapanış parantezinden sonra t2 ile biter; takma adın atlanması ayrıştırma hatasına neden olur.

Bir birleştirme anahtarı orantısız sayıda satır içerdiğinde, diğerleri boşta kalırken tek bir indirgeyici işin büyük kısmını üstlenir. hive.optimize.skewjoin ayarını yapmak veya ağır anahtarı ayırıp sonuçları birleştirmek, yükü dağıtır.

Makine öğrenimi yardımcıları EXPLAIN planını okur ve eksik bölüm filtresi, dönüştürülmemiş eşleme birleştirmesi veya çarpık anahtar gibi yaygın nedenleri işaretler. Öneriyi bir başlangıç ​​noktası olarak değerlendirin ve planla ve gerçek çalışma zamanıyla karşılaştırarak doğrulayın.

Kısa bir yorumdan standart birleştirme ve alt sorgu kalıplarını iyi bir şekilde oluşturur. Motor özelindeki her şeyi doğrulayın, çünkü kolayca karışır. Spark SQL veya Presto sözdizimini kullanır ve Hive, takma adı olmayan türetilmiş tablo gibi yapıları reddeder.

Bu yazıyı şu şekilde özetleyin: