Какво е език за заявки Hive? HiveQL Operaтори
⚡ Умно обобщение
Езикът за заявки на Hive предоставя операторите, които управляват всеки израз на HiveQL, групаping ги разделят на релационни, аритметични, логически, комплексни типове и конструкторски семейства, които заедно обхващат сравнение, изчисление и достъп до вложени данни.

Какво е Hive Query Language (HiveQL)?
Hive Query Language (HiveQL) е език за заявки в Apache Hive за обработка и анализ на структурирани данни. Той отделя потребителите от сложността на програмирането с MapReduce. Използва повторно общи концепции от релационни бази данни, като таблици, редове, колони и схеми, за да улесни обучението. Hive предоставя CLI за писане на заявки в Hive, използвайки Hive Query Language (HiveQL).
Повечето взаимодействия обикновено се осъществяват през интерфейс на командния ред (CLI). Като цяло синтаксисът на HiveQL е подобен на SQL синтаксис, с който повечето анализатори на данни са запознати. Четирите файлови формата, посочени в оригиналната документация на Hive, са TEXTFILE, SEQUENCEFILE, ORC и RCFILE (Record Columnar File); текущите версии също четат и записват Parquet и Avro, а ORC е форматът, който повечето ръководства за настройка приемат.
Hive използва вградена база данни Derby за съхранение на метаданни за един потребител. За многопотребителски или споделени метахранилища, Hive използва MySQL или друга външна релационна база данни, защото Derby позволява само една сесия едновременно.
Вграден HiveQL Operaтори
Hive предоставя вградени оператори за операциите с данни, които се изпълняват спрямо таблиците, съхранявани в хранилището на Hive.
Тези оператори действат върху операнди в израз и връщат стойност според приложената логика, независимо дали тази логика е сравнение, изчисление или търсене във вложена колона.
По-долу са изброени основните видове вградени оператори в HiveQL:
- Релационни оператори
- Аритметични оператори
- Логическите оператори
- Operaтори на сложни типове
- Конструктори от сложен тип
Всяко семейство е разгледано в отделен раздел по-долу, заедно с пълната таблица с оператори за това семейство.
Релационна Operaтори в HiveQL
Използваме релационни оператори за сравняване на връзки между два операнда.
- Operaизрази като равно, не е равно, по-малко от и по-голямо от.
- Типовете операнди в тези оператори са примитивни типове, а операторите за съпоставяне на шаблони приемат само низове.
Всеки релационен оператор връща BOOLEAN стойност, поради което от тези оператори се изграждат клауза WHERE, условие JOIN и клон CASE WHEN. Следната таблица дава подробности за релационните оператори и тяхното използване в HiveQL:
| Вграден OperaTor | Descriptйон | Operand |
|---|---|---|
| X = Y | ВЯРНО, ако израз X е еквивалентен на израз Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X != Y | ВЯРНО, ако израз X не е еквивалентен на израз Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X < Y | ВЯРНО, ако израз X е по-малък от израз Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X <= Y | ВЯРНО, ако изразът X е по-малък или равен на израза Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X > Y | ВЯРНО, ако израз X е по-голям от израз Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X >= Y | ВЯРНО, ако изразът X е по-голям или равен на израза Y. В противен случай НЕВЯРНО. | Приема всички примитивни типове |
| X Е НУЛЕВ | TRUE, ако израз X се оцени като NULL, в противен случай FALSE. | Приема всички видове |
| X НЕ Е НУЛЕВ | FALSE, ако израз X се оцени като NULL, в противен случай TRUE. | Приема всички видове |
| X КАТО Y | ВЯРНО, ако низовият шаблон X съвпада с Y, в противен случай НЕВЯРНО. | Приема само низове |
| X RLIKE Y | NULL, ако X или Y е NULL, TRUE, ако някой подниз на X съвпада с Java регулярен израз Y, в противен случай FALSE. | Приема само низове |
| X REGEXP Y | Същото като RLIKE. | Приема само низове |
Обърнете внимание, че сравнението с NULL никога не връща TRUE или FALSE. Това е причината таблицата да изброява IS NULL и IS NOT NULL като отделни оператори, вместо да се очаква X = NULL да работи.
HiveQL аритметика Operaтори
Използваме аритметични оператори за извършване на аритметични операции с операнди.
- Аритметични операции като събиране, извличанеtracОперациите умножение и деление между операнди използват тези оператори.
- Типовете операнди в тези оператори са всички числови типове.
Примерен пример:
2 + 3 дава резултат 5.
В този пример „+“ е операторът, 2 и 3 са операндите, а върнатата стойност е 5.
Следната таблица дава подробности за аритметичните оператори в Hive Query Language:
| Вграден OperaTor | Descriptйон | Operand |
|---|---|---|
| X + Y | Той ще върне резултата от добавянето на X и Y стойност. | Приема всички видове числа |
| X–Y | Ще върне изхода на подчиненияtracполучаване на Y от стойността на X. | Приема всички видове числа |
| X * Y | Той ще върне резултата от умножаването на стойности X и Y. | Приема всички видове числа |
| X / Y | Той ще върне резултата от разделянето на Y от X. | Приема всички видове числа |
| X % Y | Той ще върне остатъка, получен от разделянето на X на Y. | Приема всички видове числа |
| X & Y | Той ще върне резултата от побитово И на X и Y. | Приема всички видове числа |
| X | Y | Той ще върне резултата от побитово ИЛИ на X и Y. | Приема всички видове числа |
| X ^ Y | Той ще върне резултата от побитово XOR на X и Y. | Приема всички видове числа |
| ~X | Той ще върне изхода на побитово НЕ на X. | Приема всички видове числа |
Последните четири реда са побитови, а не обикновени аритметични операции: те работят с двоичното представяне на целочислените операнди, така че &, | и ^ не са същите като логическите AND, OR и NOT, разгледани в следващия раздел.
HiveQL Логическа Operaтори
Използваме логически оператори за извършване на логически операции с операнди.
- Логически операции като И, ИЛИ и НЕ между операнди използват тези оператори.
- Всички типове операнди в тези оператори са от тип BOOLEAN.
Следната таблица дава подробности за логическите оператори в HiveQL:
| Operaтори | Descriptйон | OperaNDS |
|---|---|---|
| X И Y | TRUE, ако X и Y са TRUE, в противен случай FALSE. | Само булеви типове |
| X && Y | Същото като X И Y, но тук използваме символа &&. | Само булеви типове |
| X ИЛИ Y | TRUE, ако X или Y или и двете са TRUE, в противен случай FALSE. | Само булеви типове |
| X || Y | Същото като X ИЛИ Y, но тук използваме символа ||. | Само булеви типове |
| НЕ X | TRUE, ако X е FALSE, в противен случай FALSE. | Само булеви типове |
| !X | Същото като NOT X, но тук използваме символа !. | Само булеви типове |
Тъй като релационните оператори връщат булеви стойности, логическите оператори са това, което ги комбинира: предикат като заплата > 50000 И отдел = 'Продажби' свързва едно семейство с другото.
Operaторове за сложни типове
Релационните, аритметичните и логическите оператори работят с единични скаларни стойности. Hive също така съхранява колони тип array, map и struct, а те се нуждаят от различен механизъм за достигане до елементите вътре в тях. Следната таблица дава подробности за операторите от сложен тип, които предоставят този механизъм:
| Operaтори | OperaNDS | Descriptйон |
|---|---|---|
| A[n] | A е масив, а n е цяло число | Ще върне n-тия елемент в масива A. Първият елемент има индекс 0. |
| M[ключ] | М е карта и ключът е тип К | Ще върне стойността, принадлежаща на ключа в картата. |
И двете форми са обикновени изрази, така че могат да се появят в SELECT списък, WHERE клауза или GROUP BY, а полето на структурата се достига с точкова нотация, като например S.field, вместо със скоба.
Конструктори от сложен тип
Където горните оператори четат съществуваща сложна колона, конструкторите изграждат такава. Следната таблица дава подробности за конструкторите на сложни типове, които създават екземпляри на сложните типове данни — Array, Map и Struct — в Hive.
В този раздел ще видим операциите, извършвани върху конструктори от сложен тип.
| Operaтори | OperaNDS | Descriptйон |
|---|---|---|
| масив | (val1, val2, …) | Това ще създаде масив с дадените елементи, както е споменато, като например val1, val2. |
| create_union | (етикет, стойност1, стойност2, …) | Това ще създаде тип обединение със стойността, към която се отнася параметърът tag. |
| карта | (ключ1, стойност1, ключ2, стойност2, …) | Ще създаде карта с дадените двойки ключ/стойност, споменати в операндите. |
| наречена_структура | (име1, стойност1, име2, стойност2, …) | Това ще създаде структура с дадените имена на полета и стойности, споменати в операндите. |
| структура | (val1, val2, val3, …) | Създава структура с дадените стойности на полетата. Имената на полетата на структурата ще бъдат колона1, колона2 и т.н. |
Конструкторите най-често се използват в INSERT, който попълва сложна колона, или в SELECT, който пакетира няколко скаларни колони в една структура, преди да запише резултата в друга таблица.
Вградени функции на HiveQL
OperaИнструментите обхващат сравнение, изчисление и достъп до елементи, но не закръгляват числа, не отрязват низове или не извършват подзаглавия.tracдве дати. Тази работа принадлежи към вградените функции на Hive, които се извикват по име в същите изрази, в които се появяват операторите. Таблицата по-долу групира семействата, с които начинаещият се среща първо.
| Семейство функции | Типични членове | За какво се използва |
|---|---|---|
| математически | кръгъл(), под(), таван(), абс.(), мощност(), квадрат(), рандомизиран() | Закръгляване, степенуване и други числови изчисления върху стойност от една колона. |
| Низ | concat(), substr(), upper(), lower(), trim(), length(), regexp_replace() | Почистване, подстригване и ретуширанеping текст, преди да бъде сравнен или групиран. |
| Дата | текуща_дата, година(), месец(), датиран_диференциал(), добавяне_на_дата(), unix_времева_печат() | Extracразделяне на части от датата и измерване на интервали между две дати. |
| условен | ако(), СЛУЧАЙ КОГАТО, сливане(), nvl(), isnull() | Избор на стойност на ниво ред и заместване на NULL с резервна стойност. |
| колекция | размер(), ключове_на_мапа(), стойности_на_мапа(), масив_съдържа(), сортиране_на_масив() | Проверка на колоните масив, карта и структура, достигнати от операторите от комплексен тип. |
| Преобразуване на типа | cast(), binary() | Принудително задаване на типа на колона, очакван от оператора. |
| Агрегат (UDAF) | брой(), сума(), средно(), мин(), макс(), събиране_на_множество() | Свиване на много редове в една стойност, обикновено заедно с GROUP BY. |
Списъкът с функции зависи от версията на Hive, така че си струва да го прочетете от самата сесия, а не от статична страница. Два оператора правят това:
SHOW FUNCTIONS; DESCRIBE FUNCTION round; DESCRIBE FUNCTION EXTENDED round;
SHOW FUNCTIONS изброява всяко регистрирано име, DESCRIBE FUNCTION отпечатва едноредовия подпис, а формата EXTENDED добавя примери за употреба, където имплементиращият клас ги предоставя. Когато няма вградена функция, Hive приема потребителски дефинирана функция написан в Java.
HiveQL срещу SQL: Ключови разлики
HiveQL умишлено заимства SQL синтаксиса и таблиците с оператори по-горе ще изглеждат познати на всеки, който е писал SQL. Моделът на изпълнение по-долу не е същият и разликите се проявяват веднага щом заявката премине отвъд обикновения SELECT.
| Поведение | HiveQL | Традиционен SQL (RDBMS) |
|---|---|---|
| Обработка на схема | Схема при четене — схемата се прилага, когато файлът е заявен | Схема при запис — схемата се прилага при вмъкване на ред |
| АКТУАЛИЗАЦИЯ и ИЗТРИВАНЕ на ниво ред | Поддържа се само за ACID таблици; управляваните таблици са ACID по подразбиране от Hive 3.0 | Поддържа се по подразбиране на всяка таблица |
| Индекси | Поддръжката на индекси беше премахната в Hive 3.0 (HIVE-18448); ORC или Parquet индекси на файлово ниво и материализирани изгледи я заменят. | B-дървото и други вторични индекси са основна характеристика |
| Изпълнение и латентност | Компилира се в пакетни задачи на Tez, MapReduce или Sparkтака че дори малките заявки носят разходи за стартиране на работа | Интерактивно изпълнение, обикновено в милисекунди |
| Цел на дизайна | Пропускателна способност за много големи файлове в HDFS или хранилище на обекти | Четене и запис с ниска латентност на един сървър или клъстер |
Практическите последици за писането на изрази са малки, но реални. OperaОператорите се държат както се очаква, но предикат, на който би се отговорило от индекс в релационна база данни, се отговаря в Hive чрез сканиране на файлове, така че филтрирането по колона на дял обикновено е много по-ценно от настройването на самия оператор.
