Przykłady zapytań Hive: Sortuj według, Grupuj według i Cluster By

⚡ Inteligentne podsumowanie

Zapytania Hive korzystają z klauzul ORDER BY, GROUP BY, SORT BY, CLUSTER BY i DISTRIBUTE BY, aby sortować, grupować i rozprzestrzeniać wiersze w reduktorach. Każda klauzula jest zaprezentowana tutaj na przykładzie pojedynczej tabeli employees.

  • 🧱 Najpierw przykładowa tabela: Employees_guru jest tworzony z sześcioma kolumnami i ładowany z pliku Employees.txt przed uruchomieniem jakiejkolwiek klauzuli.
  • 🔢 Suma w systemie ORDER BY: ORDER BY wysyła cały zestaw wyników do jednego reduktora, co gwarantuje całkowite uporządkowanie, ale spowalnia duże zapytania.
  • 🔤 Sortowanie ciągów znaków: Kolumna typu string, np. Department, jest zwracana w kolejności leksykograficznej, a nie numerycznej.
  • 📊 GROUP BY liczbami: Połączenie GROUP BY z count(*) zwraca jeden wiersz na dział z całkowitą liczbą pracowników.
  • 🔀 SORTUJ WEDŁUG reduktora: SORT BY porządkuje wiersze wewnątrz każdego reduktora, dzięki czemu wiele reduktorów generuje częściowo uporządkowane dane wyjściowe.
  • 🎯 CLUSTER BY łączy: CLUSTER BY działa jak DISTRIBUTE BY plus SORT BY, podczas gdy samo DISTRIBUTE BY kieruje pasujące klucze do jednego reduktora w postaci nieposortowanej.

Zapytania Hive Sortuj według, Grupuj według, Cluster Przez i dystrybuowane przez

Hive udostępnia język zapytań typu SQL do celów ETL na bazie Hadoop system plików.

Hive Query Language (HiveQL) zapewnia środowisko typu SQL w Hive do pracy z tabelami, bazami danych i zapytaniami.

Z Hive powiązane są różne typy klauzul umożliwiające wykonywanie różnych typów manipulacji danymi i zapytań. Ponadto Hive zapewnia łączność JDBC w celu uzyskania lepszych połączeń z węzłami spoza środowiska.

Zapytania Hive zapewniają następujące funkcje:

  • Modelowanie danych, np. tworzenie baz danych, tabel itp.
  • Funkcjonalności ETL, takie jak np.traccja, transformacja i ładowanie danych do tabel
  • Łączy do łączenia różnych tabel danych
  • Skrypty niestandardowe dostosowane do potrzeb użytkownika ułatwiające kodowanie
  • Szybsze narzędzie do wysyłania zapytań na platformie Hadoop

Tworzenie tabeli w ulu

Zanim przejdziemy do głównego tematu tego samouczka, utworzymy tabelę, która będzie stanowić punkt odniesienia dla kolejnych sekcji.

W tym samouczku utworzymy tabelę „employees_guru” z 6 kolumnami, jak pokazano na zrzucie ekranu poniżej.

Polecenie CREATE TABLE w Hive dla employees_guru i polecenie ładowania

Z powyższego zrzutu ekranu wynika,

  1. Tworzymy tabelę „employees_guru” z wartościami 6 kolumn, takimi jak ID, Imię i nazwisko, Wiek, Adres, Wynagrodzenie, Dział, które należą do pracowników obecnych w organizacji „guru”.
  2. W tym kroku ładujemy dane do tabeli employees_guru. Dane, które zamierzamy załadować, znajdują się w pliku Employees.txt.

Zamów według zapytania

Składnia komendy ORDER BY w HiveQL jest podobna do składni komendy ORDER BY w SQL język.

ORDER BY to klauzula, której używamy z poleceniem „SELECT” w Zapytania dotyczące ula Sortowanie danych. Używa kolumn w tabelach Hive do sortowania wartości określonych kolumn, o których mowa w klauzuli ORDER BY, a zapytanie wyświetla wyniki w kolejności rosnącej lub malejącej według tych wartości.

Jeśli wspomniane pole ORDER BY jest ciągiem znaków, wynik jest wyświetlany w kolejności leksykograficznej. W końcowym efekcie cały zestaw wyników musi zostać przekazany do jednego reduktora.

Ten pojedynczy reduktor sprawia również, że ORDER BY jest kosztowny w przypadku dużej tabeli, więc w trybie ścisłym (hive.mapred.mode=strict) Hive odrzuca instrukcję ORDER BY, która nie zawiera klauzuli LIMIT.

Poniższy zrzut ekranu przedstawia zapytanie ORDER BY i jego posortowane wiersze.

Zapytanie ORDER BY w employees_guru posortowane według działu

Na powyższym zrzucie ekranu możemy zaobserwować następujące rzeczy:

  1. Jest to zapytanie wykonane na tabeli „employees_guru” z klauzulą ​​ORDER BY i nazwą kolumny „Department” zdefiniowaną w klauzuli ORDER BY. „Department” to ciąg znaków, więc wyniki są wyświetlane w kolejności leksykograficznej.
  2. To jest rzeczywisty wynik zapytania. Wyniki są wyświetlane w kolejności odpowiadającej kolumnie Dział, takiej jak ADMIN, Finanse itd.

zapytanie:

SELECT * FROM employees_guru ORDER BY Department;

Grupuj według zapytania

Klauzula GROUP BY używa kolumn w tabelach Hive do grupowaniaping konkretne wartości kolumn wymienione za pomocą GROUP BY, a zapytanie wybiera i wyświetla wyniki pogrupowane według tych wartości.

Na przykład poniższy zrzut ekranu przedstawia całkowitą liczbę pracowników obecnych w każdym dziale. Tutaj wartość „Dział” jest ustawiona w opcji GROUP BY.

Zapytanie GROUP BY liczące pracowników w każdym dziale

Na powyższym zrzucie ekranu możemy zaobserwować następujące rzeczy:

  1. Jest to zapytanie wykonywane w tabeli „employees_guru” z klauzulą ​​GROUP BY i nazwą kolumny GROUP BY „Department”.
  2. Wyświetlany tutaj wynik to nazwa działu i liczba pracowników w poszczególnych działach. Wszyscy pracownicy należący do danego działu są zgrupowani i wyświetlani, więc każdy wiersz wyników zawiera nazwę działu wraz z całkowitą liczbą pracowników.

zapytanie:

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

Sortuj według

Klauzula SORT BY jest wykonywana na nazwach kolumn tabel Hive w celu posortowania danych wyjściowych. Możemy użyć klauzuli DESC do sortowania w kolejności malejącej i klauzuli ASC do sortowania w kolejności rosnącej.

Funkcja SORT BY sortuje wiersze przed przekazaniem ich do reduktora, dzięki czemu kolejność jest gwarantowana w obrębie każdego reduktora, a nie w całym wyniku. Sortowanie zawsze zależy od typu kolumny.

Na przykład, jeśli typ kolumny jest numeryczny, sortowanie odbywa się w kolejności numerycznej, a jeśli typ kolumny jest ciągiem znaków, sortowanie odbywa się w kolejności leksykograficznej.

Poniższy zrzut ekranu przedstawia zapytanie SORT BY przy użyciu DESC.

Zapytanie SORTUJ WEDŁUG employees_guru zwracające identyfikator w kolejności malejącej

Na powyższym zrzucie ekranu możemy zaobserwować następujące rzeczy:

  1. Jest to zapytanie wykonane na tabeli „employees_guru” z klauzulą ​​SORT BY i „Id” jako zdefiniowaną nazwą kolumny SORT BY. Użyliśmy słowa kluczowego DESC.
  2. Wyświetlane dane wyjściowe są zatem uporządkowane malejąco według „Id”.

zapytanie:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY jest używany jako alternatywa dla klauzul DISTRIBUTE BY i SORT BY w HiveQL.

Klauzula CLUSTER BY jest używana w tabelach obecnych w Hive. Hive używa kolumn w CLUSTER BY do dystrybucji wierszy pomiędzy reduktorami, a kolumny CLUSTER BY odnoszą się do wielu reduktorów. Zapewnia również kolejność sortowania wartości obecnych w tych wielu reduktorach.

Na przykład klauzula CLUSTER BY jest wymieniona w nazwie kolumny Id tabeli employees_guru. Wykonanie tego zapytania zwraca wyniki dla wielu reduktorów w zapleczu, ale w interfejsie jest to klauzula alternatywna dla SORT BY i DISTRIBUTE BY.

To proces zaplecza, gdy wykonujemy zapytanie z użyciem SORT BY, GROUP BY lub CLUSTER BY w kontekście frameworka MapReduce. Jeśli więc chcemy przechowywać wyniki w wielu reduktorach, używamy CLUSTER BY.

Gramatyka CLUSTER BY akceptuje tylko nazwy kolumn, dlatego nie można do niej dołączać instrukcji ASC ani DESC. Wynik w kolejności malejącej wymaga instrukcji DISTRIBUTE BY z oddzielnym poleceniem SORT BY … DESC.

Zrzut ekranu poniżej przedstawia zapytanie CLUSTER BY dla identyfikatora.

Zapytanie CLUSTER BY w kolumnie Id w employees_guru

Z powyższego zrzutu ekranu wynikają następujące wnioski:

  1. To zapytanie wykonuje klauzulę CLUSTER BY na wartości pola Id. W tym przypadku nastąpi sortowanie według wartości Id.
  2. Wyświetla wartości Id i Name obecne w employees_guru w kolejności posortowanej.

zapytanie:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Rozpowszechniaj przez

Klauzula DISTRIBUTE BY jest używana w tabelach obecnych w Hive. Hive używa kolumn w DISTRIBUTE BY do dystrybucji wierszy między reduktorami, więc wszystkie wiersze, które mają tę samą wartość w kolumnie DISTRIBUTE BY, trafiają do tego samego reduktora.

  • Zapewnia, że ​​każdy z reduktorów N otrzymuje sygnał bez nakładania sięping zestaw wartości kolumn
  • Nie sortuje wyników każdego reduktora i nie ma gwarancji, że pasujące wiersze będą znajdować się obok siebie

Zrzut ekranu poniżej przedstawia zapytanie DISTRIBUTE BY dla identyfikatora.

Zapytanie DISTRIBUTE BY w kolumnie Id w employees_guru

Na powyższym zrzucie ekranu możemy zaobserwować następujące rzeczy:

  1. Klauzula DISTRIBUTE BY jest wykonywana na identyfikatorze tabeli „employees_guru”.
  2. Na wyjściu wyświetlane są identyfikatory i nazwy. W tle wiersze o tym samym identyfikatorze trafiają do tego samego reduktora.

zapytanie:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Łatwo pomylić te cztery zdania, dlatego poniższa tabela je porównuje.

Klauzula Reduktory Co gwarantuje
ZAMÓW PRZEZ jeden Całkowite zamówienie w całym wyniku
SORTUJ WEDŁUG Wiele Zamówienia można składać tylko w ramach danego reduktora
DYSTRYBUOWANE PRZEZ Wiele Ten sam klucz dociera do tego samego reduktora, niesortowany
ZGRUPUJ WEDŁUG Wiele ROZDZIEL WEDŁUG plus SORTUJ WEDŁUG, rosnąco

FAQ

Pojedynczy reduktor musi sortować każdy wiersz, co może trwać godzinami w przypadku dużej tabeli. Limity LIMIT działają. Ustawienie hive.mapred.mode na nonstrict całkowicie usuwa to ograniczenie.

Ustaw mapreduce.job.reduces przed zapytaniem, aby ustalić liczbę, w przeciwnym razie Hive oszacuje ją na podstawie rozmiaru danych wejściowych. ORDER BY ignoruje to ustawienie, ponieważ całkowite zamówienie zawsze jest sumowane do jednego reduktora.

Nie. Klauzula akceptuje tylko nazwy kolumn i zawsze sortuje rosnąco. Zamiast tego wpisz DISTRIBUTE BY w kolumnie partycji z osobną kolumną SORT BY DESC; obie kolumny mogą się również różnić.

Są one powiązane, ale nie identyczne. Wiadro przechowuje wiersze trwale w ustalonej liczbie plików, natomiast CLUSTER BY dystrybuuje i sortuje wiersze tylko na czas trwania jednego zapytania.

Asystenci uczenia maszynowego odczytują plan EXPLAIN i sygnalizują przyczyny, takie jak nieograniczony ORDER BY, brakujący filtr partycjonowania lub przekrzywiony klucz. Potwierdź każdą sugestię w rzeczywistym środowisku wykonawczym.

Dobrze szkicuje te wzorce na podstawie krótkiego komentarza. Zweryfikuj wszystko, co dotyczy konkretnego silnika, ponieważ łatwo się w to miesza. Spark Składnia SQL lub Presto odrzucana przez Hive, np. DESC po CLUSTER BY.

Zwykły plik tekstowy o nazwie „Pracownicy.txt” zawiera wartości sześciu kolumn i jest ładowany do tabeli przed uruchomieniem pierwszego zapytania. Każdy plik z separatorami i pasującymi kolumnami działa w ten sam sposób.

Semantyka jest identyczna, ponieważ dotyczą one funkcji języka HiveQL, a nie funkcji silnika. Zmienia się tylko plan fizyczny — silniki inaczej planują sortowanie i tasowanie etapów, więc czasy wykonania różnią się, a wyniki nie.

Podsumuj ten post następująco: