Примери за заявки към Hive: Подреждане по, Групиране по и Cluster By
⚡ Умно обобщение
Заявките към Hive използват клаузи ORDER BY, GROUP BY, SORT BY, CLUSTER BY и DISTRIBUTE BY за сортиране, групиране и разпределяне на редове между редуктори, като всяка клауза е демонстрирана тук върху една примерна таблица на служителите.

Hive предоставя език за заявки от тип SQL за ETL цели, в допълнение към Hadoop файлова система.
Hive Query Language (HiveQL) предоставя SQL-тип среда в Hive за работа с таблици, бази данни и заявки.
Различни видове клаузи са свързани с Hive за извършване на различни видове манипулиране на данни и заявки, а Hive осигурява JDBC свързаност за по-добри връзки с възли извън средата.
Заявките към Hive предоставят следните функции:
- Моделиране на данни, като например създаване на бази данни, таблици и др.
- ETL функционалности, като например extracция, трансформация и зареждане на данни в таблици
- Се присъедини към за обединяване на различни таблици с данни
- Специфични за потребителя персонализирани скриптове за улесняване на кода
- По-бърз инструмент за заявки върху Hadoop
Създаване на таблица в Hive
Преди да започнем с основната тема на този урок, първо ще създадем таблица, която да използваме като справка за следващите раздели.
В този урок ще създадем таблицата „employees_guru“ с 6 колони, както е показано на екранната снимка по-долу.
От горната екранна снимка,
- Създаваме таблицата „employees_guru“ с 6 стойности в колоните, като например Id, Name, Age, Address, Salary, Department, които принадлежат на служителите, присъстващи в организацията „guru“.
- В тази стъпка зареждаме данни в таблицата employees_guru. Данните, които ще заредим, се поставят във файла Employees.txt.
Поръчай по запитване
Синтаксисът на ORDER BY в HiveQL е подобен на синтаксиса на ORDER BY в SQL език.
ORDER BY е клаузата, която използваме с оператора „SELECT“ в Hive запитвания за сортиране на данни. Използва колони в таблици на Hive за сортиране на конкретните стойности на колоните, посочени с ORDER BY, и заявката показва резултатите във възходящ или низходящ ред на тези стойности.
Ако споменатото поле ORDER BY е низ, тогава резултатът се показва в лексикографски ред. В back-end системата целият набор от резултати трябва да бъде предаден на един единствен редуктор.
Този единичен редуктор също така прави ORDER BY скъп на голяма таблица, така че в строг режим (hive.mapred.mode=строг) Hive отхвърля ORDER BY, който не съдържа клауза LIMIT.
Екранната снимка по-долу показва заявката ORDER BY и сортираните в нея редове.
От горната екранна снимка можем да наблюдаваме следното:
- Това е заявката, извършена върху таблицата „employees_guru“ с клаузата ORDER BY и Department като дефинираното име на колоната ORDER BY. „Department“ е низ, така че показва резултати въз основа на лексикографски ред.
- Това е действителният резултат от заявката. Резултатите се показват въз основа на колоната „Отдел“, като например АДМИНИСТРАЦИЯ, Финанси и т.н., по ред.
Запитване:
SELECT * FROM employees_guru ORDER BY Department;
Групиране по заявка
Клаузата GROUP BY използва колони в таблици на Hive за групиранеping конкретните стойности на колоните, посочени с GROUP BY, и заявката избира и показва резултатите, групирани по тези стойности.
Например, екранната снимка по-долу показва общия брой служители във всеки отдел. Тук имаме „Отдел“ като стойност GROUP BY.
От горната екранна снимка ще наблюдаваме следното:
- Това е заявката, която се изпълнява върху таблицата „employees_guru“ с клаузата GROUP BY и отдела като дефинираното име на колоната GROUP BY.
- Показаният тук резултат е името на отдела и броят на служителите в различните отдели. Всички служители, принадлежащи към определен отдел, са групирани и показани, така че всеки ред с резултата е име на отдел с общия брой служители.
Запитване:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
Сортиране по
Клаузата SORT BY сортира изхода с имената на колоните в таблиците Hive. Можем да споменем DESC за сортиране в низходящ ред и ASC за сортиране във възходящ ред.
SORT BY сортира редовете, преди да ги подаде към редуктора, така че подреждането е гарантирано във всеки редуктор, а не в целия резултат. Сортирането винаги зависи от типа на колоната.
Например, ако типът колона е числов, сортирането се извършва по числов ред, а ако типът колона е низов, сортирането се извършва по лексикографски ред.
Екранната снимка по-долу показва заявката SORT BY, използваща DESC.
От горната екранна снимка можем да наблюдаваме следното:
- Това е заявката, извършена върху таблицата „employees_guru“ с клаузата SORT BY и „Id“ като дефинирано име на колоната SORT BY. Използвахме ключовата дума DESC.
- Така показаният резултат е в низходящ ред на „Id“.
Запитване:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
CLUSTER BY се използва като алтернатива както за клаузите DISTRIBUTE BY, така и за SORT BY в HiveQL.
Клаузата CLUSTER BY се използва в таблици, налични в Hive. Hive използва колоните в CLUSTER BY, за да разпредели редовете между редукторите, а колоните CLUSTER BY отиват към множество редуктори. Тя също така осигурява реда на сортиране на стойностите, налични в тези множество редуктори.
Например, клаузата CLUSTER BY е спомената в името на колоната Id на таблицата employees_guru. Изпълнението на тази заявка дава резултати на множество редуктори в back-end-а, но във front-end-а тя е алтернативна клауза както за SORT BY, така и за DISTRIBUTE BY.
Това е процесът в бек-енда, когато изпълняваме заявка със SORT BY, GROUP BY или CLUSTER BY в рамките на MapReduce framework. Така че, ако искаме да съхраним резултатите в множество редуктори, използваме CLUSTER BY.
Граматиката CLUSTER BY приема само имена на колони, така че ASC и DESC не могат да бъдат прикачени към нея; низходящ резултат изисква DISTRIBUTE BY с отделно SORT BY … DESC.
Екранната снимка по-долу показва заявката CLUSTER BY на Id.
От горната екранна снимка получаваме следните наблюдения:
- Това е заявката, която изпълнява клаузата CLUSTER BY върху стойността на полето Id. Тук ще се получи сортиране по стойностите на Id.
- Показва стойностите на Id и Name, присъстващи в employees_guru, в сортиран ред.
Запитване:
SELECT Id, Name from employees_guru CLUSTER BY Id;
Разпределете по
Клаузата DISTRIBUTE BY се използва в таблици, налични в Hive. Hive използва колоните в DISTRIBUTE BY, за да разпредели редовете между редукторите, така че всички редове, които споделят една и съща стойност на колоната DISTRIBUTE BY, отиват към един и същ редуктор.
- Това гарантира, че всеки от N редукторите получава не-припокриванеping набор от стойности на колоните
- Не сортира изхода на всеки редуктор и не е гарантирано, че съвпадащите редове ще стоят един до друг.
Екранната снимка по-долу показва заявката DISTRIBUTE BY на Id.
От горната екранна снимка можем да наблюдаваме следното:
- Клаузата DISTRIBUTE BY се изпълнява върху идентификатора на таблицата „employees_guru“.
- Изходът показва Id и Name. В задната част редовете с един и същ Id отиват към един и същ редуктор.
Запитване:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;
Четирите клаузи са лесни за объркване, така че таблицата по-долу ги сравнява.
| Клауза | редуктори | Какво гарантира |
|---|---|---|
| ПОДРЕДЕНИ ПО | Един | Общ ред в целия резултат |
| СОРТИЧНО ПО | Много | Поръчване само в рамките на всеки редуктор |
| РАЗПРОСТРАНЯВА СЕ ПО | Много | Същият ключ достига до същия редуктор, несортиран |
| КЛЪСТЕР ПО | Много | РАЗПРЕДЕЛЕНИЕ ПО плюс СОРТИРАНЕ ПО, възходящо |






