Примери за заявки към Hive: Подреждане по, Групиране по и Cluster By

⚡ Умно обобщение

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

  • 🧱 Примерна таблица първо: employees_guru се създава с шест колони и се зарежда от Employees.txt преди изпълнението на която и да е клауза.
  • 🔢 ПОРЪЧАЙ ПО общи суми: ORDER BY изпраща целия набор от резултати към един редуктор, което гарантира пълен ред, но забавя големите заявки.
  • 🔤 Сортиране на низове: Колона с низове, като например „Отдел“, се връща в лексикографски, а не в числов ред.
  • 📊 Брой на GROUP BY: Сдвояването на GROUP BY с count(*) връща по един ред за всеки отдел с общия брой служители.
  • 🔀 СОРТИРАНЕ ПО е за редуктор: SORT BY подрежда редовете във всеки редуктор, така че множество редуктори произвеждат частично подреден изход.
  • 🎯 КЛЪСТЪР ПО съчетава: CLUSTER BY действа като DISTRIBUTE BY плюс SORT BY, докато DISTRIBUTE BY самостоятелно насочва съвпадащите ключове към един несортиран редуктор.

Заявки за кошер Подреждане по, Групиране по, Cluster От и разпространява от

Hive предоставя език за заявки от тип SQL за ETL цели, в допълнение към Hadoop файлова система.

Hive Query Language (HiveQL) предоставя SQL-тип среда в Hive за работа с таблици, бази данни и заявки.

Различни видове клаузи са свързани с Hive за извършване на различни видове манипулиране на данни и заявки, а Hive осигурява JDBC свързаност за по-добри връзки с възли извън средата.

Заявките към Hive предоставят следните функции:

  • Моделиране на данни, като например създаване на бази данни, таблици и др.
  • ETL функционалности, като например extracция, трансформация и зареждане на данни в таблици
  • Се присъедини към за обединяване на различни таблици с данни
  • Специфични за потребителя персонализирани скриптове за улесняване на кода
  • По-бърз инструмент за заявки върху Hadoop

Създаване на таблица в Hive

Преди да започнем с основната тема на този урок, първо ще създадем таблица, която да използваме като справка за следващите раздели.

В този урок ще създадем таблицата „employees_guru“ с 6 колони, както е показано на екранната снимка по-долу.

Изразът CREATE TABLE на Hive за employees_guru и командата load

От горната екранна снимка,

  1. Създаваме таблицата „employees_guru“ с 6 стойности в колоните, като например Id, Name, Age, Address, Salary, Department, които принадлежат на служителите, присъстващи в организацията „guru“.
  2. В тази стъпка зареждаме данни в таблицата 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 и сортираните в нея редове.

ORDER BY заявка за employees_guru, сортирана по отдел

От горната екранна снимка можем да наблюдаваме следното:

  1. Това е заявката, извършена върху таблицата „employees_guru“ с клаузата ORDER BY и Department като дефинираното име на колоната ORDER BY. „Department“ е низ, така че показва резултати въз основа на лексикографски ред.
  2. Това е действителният резултат от заявката. Резултатите се показват въз основа на колоната „Отдел“, като например АДМИНИСТРАЦИЯ, Финанси и т.н., по ред.

Запитване:

SELECT * FROM employees_guru ORDER BY Department;

Групиране по заявка

Клаузата GROUP BY използва колони в таблици на Hive за групиранеping конкретните стойности на колоните, посочени с GROUP BY, и заявката избира и показва резултатите, групирани по тези стойности.

Например, екранната снимка по-долу показва общия брой служители във всеки отдел. Тук имаме „Отдел“ като стойност GROUP BY.

GROUP BY заявка за преброяване на служителите във всеки отдел

От горната екранна снимка ще наблюдаваме следното:

  1. Това е заявката, която се изпълнява върху таблицата „employees_guru“ с клаузата GROUP BY и отдела като дефинираното име на колоната GROUP BY.
  2. Показаният тук резултат е името на отдела и броят на служителите в различните отдели. Всички служители, принадлежащи към определен отдел, са групирани и показани, така че всеки ред с резултата е име на отдел с общия брой служители.

Запитване:

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

Сортиране по

Клаузата SORT BY сортира изхода с имената на колоните в таблиците Hive. Можем да споменем DESC за сортиране в низходящ ред и ASC за сортиране във възходящ ред.

SORT BY сортира редовете, преди да ги подаде към редуктора, така че подреждането е гарантирано във всеки редуктор, а не в целия резултат. Сортирането винаги зависи от типа на колоната.

Например, ако типът колона е числов, сортирането се извършва по числов ред, а ако типът колона е низов, сортирането се извършва по лексикографски ред.

Екранната снимка по-долу показва заявката SORT BY, използваща DESC.

СОРТИРАНЕ ПО заявка за employees_guru, връщаща Id в низходящ ред

От горната екранна снимка можем да наблюдаваме следното:

  1. Това е заявката, извършена върху таблицата „employees_guru“ с клаузата SORT BY и „Id“ като дефинирано име на колоната SORT BY. Използвахме ключовата дума DESC.
  2. Така показаният резултат е в низходящ ред на „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 на employees_guru

От горната екранна снимка получаваме следните наблюдения:

  1. Това е заявката, която изпълнява клаузата CLUSTER BY върху стойността на полето Id. Тук ще се получи сортиране по стойностите на Id.
  2. Показва стойностите на 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 в колоната Id на employees_guru

От горната екранна снимка можем да наблюдаваме следното:

  1. Клаузата DISTRIBUTE BY се изпълнява върху идентификатора на таблицата „employees_guru“.
  2. Изходът показва Id и Name. В задната част редовете с един и същ Id отиват към един и същ редуктор.

Запитване:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Четирите клаузи са лесни за объркване, така че таблицата по-долу ги сравнява.

Клауза редуктори Какво гарантира
ПОДРЕДЕНИ ПО Един Общ ред в целия резултат
СОРТИЧНО ПО Много Поръчване само в рамките на всеки редуктор
РАЗПРОСТРАНЯВА СЕ ПО Много Същият ключ достига до същия редуктор, несортиран
КЛЪСТЕР ПО Много РАЗПРЕДЕЛЕНИЕ ПО плюс СОРТИРАНЕ ПО, възходящо

Въпроси и Отговори

Един единствен редуктор трябва да сортира всеки ред, което може да работи с часове в голяма таблица. LIMIT граници, които работят. Задаването на hive.mapred.mode на nonstrict премахва ограничението изцяло.

Задайте mapreduce.job.reduces преди заявката, за да фиксирате броя, в противен случай Hive го оценява от входния размер. ORDER BY игнорира настройката, защото общият ред винаги се свива върху един редуктор.

Не. Клаузата приема само имена на колони и винаги сортира във възходящ ред. Вместо това напишете DISTRIBUTE BY в колоната за дялове с отделна колона SORT BY DESC; двете колони може също да се различават.

Те са свързани, но не са идентични. Кофа съхранява редове постоянно във фиксиран брой файлове, докато CLUSTER BY разпределя и сортира редове само за времетраенето на една заявка.

Асистентите за машинно обучение прочитат плана EXPLAIN и маркират причини, като например неограничен ORDER BY, липсващ филтър за дялове или изкривен ключ. Проверяват всяко предложение спрямо действителната среда за изпълнение.

Той изготвя тези модели добре от кратък коментар. Проверете всичко, специфично за двигателя, защото лесно се смесва Spark Синтаксис на SQL или Presto, който Hive отхвърля, като например DESC след CLUSTER BY.

Текстов файл с име Employees.txt съдържа стойностите на шестте колони и се зарежда в таблицата преди изпълнението на първата заявка. Всеки файл с разделители и съответстващи колони работи по същия начин.

Семантиката е идентична, защото са характеристики на езика HiveQL, а не на енджина. Променя се само физическият план — енджините планират етапите на сортиране и разбъркване по различен начин, така че времената за изпълнение варират, докато резултатите не.

Обобщете тази публикация с: