Hive Sorgu Örnekleri: Sırala, Gruplandır ve Cluster By

⚡ Akıllı Özet

Hive sorguları, satırları sıralamak, gruplandırmak ve indirgeyiciler arasında dağıtmak için ORDER BY, GROUP BY, SORT BY, CLUSTER BY ve DISTRIBUTE BY yan tümcelerini kullanır ve her bir yan tümce burada tek bir örnek çalışanlar tablosunda gösterilmiştir.

  • 🧱 Önce örnek tablo: employees_guru tablosu altı sütundan oluşur ve herhangi bir madde çalıştırılmadan önce Employees.txt dosyasından yüklenir.
  • 🔢 TOPLAMLARA GÖRE SIRALA: ORDER BY, tüm sonuç kümesini tek bir indirgeyiciye gönderir; bu, tam sıralamayı garanti eder ancak büyük sorguları yavaşlatır.
  • 🔤 Dize sıralaması: "Departman" gibi bir metin sütunu, sayısal sıraya göre değil, sözlükbilimsel sıraya göre döndürülür.
  • 📊 GRUPLAMA ÖLÇÜLERİ: GROUP BY ifadesini count(*) ile birleştirmek, her departman için toplam çalışan sayısını içeren bir satır döndürür.
  • 🔀 Sıralama ölçütü, indirgeyici başına yapılır: SORT BY komutu, her bir reducer içindeki satırları sıralar; bu nedenle birden fazla reducer kısmen sıralı çıktı üretir.
  • 🎯 CLUSTER BY şunları birleştirir: CLUSTER BY, DISTRIBUTE BY ve SORT BY'nin birleşimi gibi davranırken, yalnızca DISTRIBUTE BY, eşleşen anahtarları sıralanmamış şekilde tek bir indirgeyiciye yönlendirir.

Hive sorguları Sırala, Gruplandır, Cluster Tarafından ve Dağıtılır

Hive, ETL amaçları için SQL benzeri bir sorgulama dili sunar. Hadoop'un dosya sistemi.

Hive Sorgu Dili (HiveQL), Hive'da tablolar, veritabanları ve sorgularla çalışmak için SQL benzeri bir ortam sağlar.

Hive ile ilişkili farklı türdeki maddeler, farklı veri işleme ve sorgulama türlerini gerçekleştirmek için kullanılır ve Hive, ortam dışındaki düğümlerle daha iyi bağlantılar kurmak için JDBC bağlantısı sağlar.

Hive sorguları aşağıdaki özellikleri sağlar:

  • Veri modelleme, örneğin veritabanları, tablolar vb. oluşturma.
  • ETL işlevleri, örneğintracVerilerin tablolara aktarılması, dönüştürülmesi ve yüklenmesi
  • Katıldı farklı veri tablolarını birleştirmek için
  • Kod kolaylığı için kullanıcıya özel özel komut dosyaları
  • Hadoop'a ek olarak daha hızlı sorgulama aracı

Hive'da Tablo Oluşturma

Bu eğitimin ana konusuna başlamadan önce, ilerleyen bölümlerde referans olarak kullanacağımız bir tablo oluşturacağız.

Bu eğitimde, aşağıdaki ekran görüntüsünde gösterildiği gibi 6 sütunlu "employees_guru" tablosunu oluşturacağız.

Hive'da employees_guru için CREATE TABLE ifadesi ve load komutu.

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

  1. “Guru” adlı kuruluşta bulunan çalışanlara ait Id, Name, Age, Address, Salary, Department gibi 6 sütun değerine sahip “employees_guru” tablosunu oluşturuyoruz.
  2. Bu adımda, employees_guru tablosuna veri yüklüyoruz. Yükleyeceğimiz veriler Employees.txt dosyasında yer almaktadır.

Sorguya göre sırala

HiveQL'deki ORDER BY sözdizimi, SQL'deki ORDER BY sözdizimine benzer. SQL dil.

ORDER BY, "SELECT" ifadesiyle birlikte kullandığımız yan tümcedir. Kovan sorguları Verileri sıralamak için kullanılır. Hive tablolarındaki sütunları kullanarak, ORDER BY ile belirtilen sütun değerlerini sıralar ve sorgu sonuçları bu değerlerin artan veya azalan sırasına göre görüntüler.

Bahsedilen ORDER BY alanı bir metin dizesi ise, sonuç sözlükbilimsel sırayla görüntülenir. Arka uçta, tüm sonuç kümesi tek bir indirgeyiciye iletilmelidir.

Bu tek redüktör ayrıca büyük bir masada ORDER BY işlemini pahalı hale getiriyor, bu nedenle katı modda (hive.mapred.mode=strictHive, LIMIT maddesi içermeyen bir ORDER BY isteğini reddeder.

Aşağıdaki ekran görüntüsü, ORDER BY sorgusunu ve sıralanmış satırlarını göstermektedir.

employees_guru tablosunda ORDER BY sorgusu, Departmana göre sıralanmıştır.

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

  1. Bu sorgu, "employees_guru" tablosunda ORDER BY koşulu ve tanımlanmış ORDER BY sütun adı olarak "Department" kullanılarak gerçekleştirilir. "Department" bir metin olduğundan, sonuçlar alfabetik sıraya göre görüntülenir.
  2. Bu, sorgunun gerçek çıktısıdır. Sonuçlar, ADMIN, Finance vb. gibi Departman sütununa göre sırayla görüntülenir.

Sorgu:

SELECT * FROM employees_guru ORDER BY Department;

Sorguya göre gruplandır

GROUP BY yan tümcesi, gruplandırma için Hive tablolarındaki sütunları kullanır.ping GROUP BY ile belirtilen belirli sütun değerleri kullanılır ve sorgu, bu değerlere göre gruplandırılmış sonuçları seçer ve görüntüler.

Örneğin, aşağıdaki ekran görüntüsü her departmanda bulunan toplam çalışan sayısını göstermektedir. Burada "Departman" değeri GROUP BY olarak belirlenmiştir.

Her departmandaki çalışan sayısını sayan GROUP BY sorgusu

Yukarıdaki ekran görüntüsünden şunları gözlemleyeceğiz:

  1. Bu, "employees_guru" tablosunda GROUP BY yan tümcesi ve tanımlanmış GROUP BY sütun adı olarak "Department" kullanılarak gerçekleştirilen sorgudur.
  2. Burada gösterilen çıktı, departman adı ve farklı departmanlardaki çalışan sayısıdır. Belirli bir departmana ait tüm çalışanlar gruplandırılarak görüntülenir, bu nedenle her sonuç satırı, toplam çalışan sayısıyla birlikte bir departman adıdır.

Sorgu:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Göre sırala

SORT BY ifadesi, Hive tablolarının sütun adları üzerinde sıralama işlemi gerçekleştirir. Azalan sırada sıralama için DESC, artan sırada sıralama için ise ASC ifadesini kullanabiliriz.

SORT BY, satırları indirgeyiciye beslemeden önce sıralar, böylece sıralama tüm sonuç genelinde değil, her indirgeyici içinde garanti edilir. Sıralama her zaman sütun türüne bağlıdır.

Örneğin, sütun türü sayısal ise sayısal sıraya göre, sütun türü metin ise sözlük sırasına göre sıralanır.

Aşağıdaki ekran görüntüsü, DESC (azalan) sıralama yöntemi kullanılarak yapılan SORT BY sorgusunu göstermektedir.

employees_guru tablosunda Id değerlerini azalan sırada döndüren SORT BY sorgusu.

Yukarıdaki ekran görüntüsünden aşağıdakileri gözlemleyebiliriz:

  1. Bu, "employees_guru" tablosunda SORT BY koşulu ve "Id" tanımlanmış SORT BY sütun adı ile gerçekleştirilen sorgudur. DESC anahtar kelimesini kullandık.
  2. Dolayısıyla görüntülenen çıktı "Id" değerine göre azalan sıradadır.

Sorgu:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY, HiveQL'de hem DISTRIBUTE BY hem de SORT BY yan tümcelerine alternatif olarak kullanılır.

CLUSTER BY yan tümcesi, Hive'da bulunan tablolarda kullanılır. Hive, CLUSTER BY'daki sütunları kullanarak satırları indirgeyiciler arasında dağıtır ve CLUSTER BY sütunları birden fazla indirgeyiciye gider. Ayrıca, bu birden fazla indirgeyicide bulunan değerlerin sıralama düzenini de sağlar.

Örneğin, CLUSTER BY ifadesi employees_guru tablosunun Id sütun adında belirtilmiştir. Bu sorguyu çalıştırmak, arka uçtaki birden fazla reducer'a sonuç verir, ancak ön uçta hem SORT BY hem de DISTRIBUTE BY için alternatif bir ifadedir.

MapReduce çerçevesinde SORT BY, GROUP BY veya CLUSTER BY ile sorgu yaptığımızda arka uç işlemi budur. Dolayısıyla, sonuçları birden fazla reducer'a kaydetmek istiyorsak, CLUSTER BY'ı kullanırız.

CLUSTER BY sözdizimi yalnızca sütun adlarını kabul eder, bu nedenle ASC ve DESC ona eklenemez; azalan bir sonuç için ayrı bir SORT BY … DESC ile DISTRIBUTE BY kullanılması gerekir.

Aşağıdaki ekran görüntüsü, Id üzerinde CLUSTER BY sorgusunu göstermektedir.

employees_guru tablosunun Id sütununda CLUSTER BY sorgusu

Yukarıdaki ekran görüntüsünden şu gözlemleri elde ediyoruz:

  1. Bu sorgu, Id alanındaki değere CLUSTER BY koşulunu uygular. Burada Id değerlerine göre sıralama yapılacaktır.
  2. Bu, employees_guru tablosunda bulunan Id ve Name değerlerini sıralı bir şekilde görüntüler.

Sorgu:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Şuna göre dağıt:

DISTRIBUTE BY yan tümcesi, Hive'da bulunan tablolarda kullanılır. Hive, DISTRIBUTE BY'deki sütunları kullanarak satırları indirgeyiciler arasında dağıtır; böylece aynı DISTRIBUTE BY sütun değerine sahip tüm satırlar aynı indirgeyiciye gider.

  • Bu, N adet indirgeyicinin her birinin örtüşmeyen bir sinyal almasını sağlar.ping sütun değerleri kümesi
  • Her bir indirgeyicinin çıktısını sıralamaz ve eşleşen satırların yan yana gelmesi garanti edilmez.

Aşağıdaki ekran görüntüsü, Id üzerinde DISTRIBUTE BY sorgusunu göstermektedir.

employees_guru tablosunun Id sütununda DISTRIBUTE BY sorgusu

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

  1. DISTRIBUTE BY ifadesi, “employees_guru” tablosunun kimliği üzerinde gerçekleştirilir.
  2. Çıktıda Kimlik (Id) ve İsim (Name) gösterilir. Arka uçta, aynı kimliğe sahip satırlar aynı indirgeyiciye (reducer) gider.

Sorgu:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Bu dört madde birbirine karıştırılmaya müsait olduğundan, aşağıdaki tabloda karşılaştırılmıştır.

fıkra Redüktörler Neyi garanti ediyor?
TARAFINDAN SİPARİŞ Bir Tüm sonuçlar genelindeki toplam sipariş miktarı
SIRALAMA çok Her bir redüktör içinden sipariş verme seçeneği yalnızca mevcuttur.
DAĞITIM İŞLEMİ çok Aynı anahtar aynı indirgeyiciye ulaşır, sıralanmamıştır.
KÜMELEME çok DAĞITIM ÖLÇÜTÜ ve SIRALAMA ÖLÇÜTÜ, artan sırada

SSS

Tek bir reducer'ın her satırı sıralaması gerekiyor ve bu, büyük bir tabloda saatlerce sürebilir. LIMIT bu durumu sınırlandırıyor. hive.mapred.mode'u nonstrict olarak ayarlamak, kısıtlamayı tamamen kaldırıyor.

Sorgudan önce `mapreduce.job.reduces` ayarını yaparak sayıyı sabitleyebilirsiniz, aksi takdirde Hive bunu giriş boyutundan tahmin eder. `ORDER BY` ayarı dikkate alınmaz, çünkü toplam sıralama her zaman tek bir indirgeyiciye odaklanır.

Hayır. Bu madde yalnızca sütun adlarını kabul eder ve her zaman artan sırada sıralar. Bunun yerine, bölümleme sütununa DISTRIBUTE BY yazın ve ayrı bir SORT BY sütununa DESC yazın; iki sütun farklı da olabilir.

Birbirleriyle akrabalar ama özdeş değiller. Kovalama `CLUSTER BY`, satırları sabit sayıda dosyada kalıcı olarak saklarken, `CLUSTER BY` ise satırları yalnızca tek bir sorgu süresince dağıtır ve sıralar.

Makine öğrenimi yardımcıları EXPLAIN planını okur ve sınırsız ORDER BY, eksik bölüm filtresi veya çarpık anahtar gibi nedenleri işaretler. Her öneriyi gerçek çalışma zamanıyla karşılaştırarak doğrular.

Kısa bir yorumdan bu kalıpları iyi bir şekilde çıkarıyor. Motor özelinde herhangi bir şeyi doğrulayın, çünkü kolayca karışıyor. Spark Hive'ın reddettiği SQL veya Presto söz dizimi, örneğin CLUSTER BY'dan sonra gelen DESC gibi.

Employees.txt adlı düz metin dosyası, altı sütun değerini içerir ve ilk sorgu çalıştırılmadan önce tabloya yüklenir. Eşleşen sütunlara sahip herhangi bir sınırlayıcı karakterle ayrılmış dosya da aynı şekilde çalışır.

Anlamları aynıdır, çünkü bunlar motor özelliklerinden ziyade HiveQL dil özellikleridir. Sadece fiziksel plan değişir; motorlar sıralama ve karıştırma aşamalarını farklı şekilde planlar, bu nedenle çalışma süreleri değişirken sonuçlar değişmez.

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