Функции на Hive: Пример за вградени и UDF (потребителски дефинирани)
⚡ Умно обобщение
Функциите на Hive се разделят на две групи: вградени функции, които се доставят с енджина и обхващат колекции, дати, математически, условни, низови и разни задачи, и потребителски дефинирани функции, написани на Java за логика Hive не предоставя.
Функциите са създадени за конкретна цел да извършват операции като математически, аритметични, логически и релационни операции върху операндите на имената на колоните в таблицата.
Вградени функции
Това са функции, които вече са налични в Hive. Първо трябва да проверим изискванията за приложението и след това можем да използваме тези вградени функции в нашите приложения. Можем да извикаме тези функции директно в нашето приложение.
Синтаксисът и типовете са споменати в следващия раздел.
Видове вградени функции в Hive:
- Функции за събиране
- Функции за дата
- Математически функции
- Условни функции
- Струнни функции
- Разни Функции
Всяко от шестте семейства е разгледано по-долу със своите функционални сигнатури и типове връщани стойности.
Функции за събиране
Тези функции се използват за колекции. Колекциите означават групатаping от елементи и те връщат единичен елемент или масив от елементи в зависимост от типа на връщането, посочен в името на функцията.
| Тип на връщане | Име на функция | Descriptйон |
|---|---|---|
| INT | размер (карта ) | Ще извлече и ще даде броя на компонентите в типа карта |
| INT | размер (масив ) | Той ще извлече и ще даде броя на елементите в типа масив |
| Масив | map_keys(Карта ) | Ще извлече и ще върне масив, съдържащ ключовете на входната карта. Масивът е неподреден. |
| Масив | map_values(Карта ) | Ще извлече и ще върне масив, съдържащ стойностите на входната карта. Масивът е неподреден. |
| Масив | сортиране_масив(Масив ) | Сортира входния масив във възходящ ред на елементите му и го връща |
| Булева | array_contains(Масив , стойност) | Връща TRUE, ако масивът съдържа стойността, предадена като втори аргумент |
Функции за дата
Те се използват за извършване на манипулации с дати и преобразуване на типове дати от един тип в друг тип:
| Име на функция | Тип на връщане | Descriptйон |
|---|---|---|
| unix_timestamp() | BIGINT | Ще получим тока Unix времева маркировка в секунди. Стойността не е фиксирана за цялата заявка |
| to_date(низ за времева_печат) | дата | Ще извлече и ще даде частта с датата от низ с времеви отпечатък |
| година (низ дата) | INT | Той ще извлече и даде годината като част от дата или низ от клеймо за време |
| тримесечие (дата/клеймо за час/низ) | INT | Той ще извлече и даде тримесечието на годината за дата, времево клеймо или низ в диапазона от 1 до 4 |
| месец (низ дата) | INT | Той ще даде на месеца част от дата или низ от клеймо за време |
| час (низ дата) | INT | Ще извлече и ще даде часа на времевия печат |
| минута (низ дата) | INT | Ще извлече и ще даде минутата на времевия печат |
| date_sub(низ начална дата, int дни) | дата | Ще извлече и ще даде резултата от подпрограматаtracняколко дни от началната дата |
| текуща_дата | дата | Ще извлече и ще даде текущата дата в началото на оценката на заявката |
| last_day(низ за дата) | низ | Ще извлече и ще даде последния ден от месеца, към който принадлежи датата. |
| trunc(низ дата, низ формат) | низ | Ще извлече и ще даде датата, съкратена до единицата, зададена от формата. Поддържани формати: МЕСЕЦ/МОН/ММ, ГОДИНА/ГГГГ/ГГ. |
Математически функции
Тези функции се използват за математически операции. Вместо да създаваме UDF, в Hive имаме някои вградени математически функции.
| Име на функция | Тип на връщане | Descriptйон |
|---|---|---|
| кръгъл (ДВОЙНО X) | DOUBLE | Ще извлече и върне закръглената BIGINT стойност на X |
| кръгъл (DOUBLE X, INT d) | DOUBLE | Ще извлече и върне X, закръглени до d знака след десетичната запетая |
| кафяв (DOUBLE X) | DOUBLE | Ще извлече и върне закръглената BIGINT стойност на X, използвайки режим на закръгляване HALF_EVEN, известен още като банкерско закръгляване. |
| етаж (ДВОЙНО X) | BIGINT | Ще извлече и върне максималната BIGINT стойност, която е равна или по-малка от стойността X. |
| таван(DOUBLE a), таван(DOUBLE a) | BIGINT | Ще извлече и върне минималната BIGINT стойност, която е равна или по-голяма от стойността a |
| rand(), rand(INT seed) | DOUBLE | Той ще извлече и върне случайно число, което е равномерно разпределено от 0 до 1. Предоставянето на начален елемент прави последователността повторяема. |
Условни функции
Тези функции се използват за проверки на условни стойности.
| Име на функция | Тип на връщане | Descriptйон |
|---|---|---|
| if(Boolean testCondition, T valueTrue, T valueFalseOrNull) | T | Ще даде valueTrue, когато testCondition е true, и valueFalseOrNull в противен случай. |
| е null(X) | Булева | Ще извлече и ще даде true, ако X е NULL, и false в противен случай. |
| не е нула(X) | Булева | Ще извлече и ще даде true, ако X не е NULL, и false в противен случай. |
| nvl(T стойност, T стойност_по_подразбиране) | T | Ще даде default_value, когато value е NULL, и value в противен случай. |
Струнни функции
Манипулациите с низове и операциите с низове се обработват от следните функции.
| Име на функция | Тип на връщане | Descriptйон |
|---|---|---|
| обратен(низ X) | низ | Той ще даде обратния низ на X |
| rpad(string str, int length, string pad) | низ | Ще извлече и ще даде str, допълнен отдясно с подложка, до обща дължина от length |
| rtrim(низ X) | низ | Той ще извлече и върне низа, получен от изрязването на интервали от края (дясната страна) на X. Например, rtrim('резултати') води до 'резултати' |
| интервал (INT n) | низ | Ще извлече и ще даде низ от n интервала. |
| split(STRING str, STRING pat) | масив | Разделя str около pat (pat е регулярен израз). |
| str_to_map(текст[, разделител1, разделител2]) | карта | Той ще раздели текста на двойки ключ-стойност, използвайки два разделителя. Delimiter1 разделя двойките, а delimiter2 разделя всяка двойка. |
Разни Функции
Няколко вградени функции не принадлежат към нито едно от горните семейства. Те обхващат хеширане, информация за сесията и извикване на произволни функции. Java методи.
| Име на функция | Тип на връщане | Descriptйон |
|---|---|---|
| хеш(a1[, a2…]) | INT | Връща хеш стойност на аргументите |
| текущ_потребител() | низ | Връща текущото потребителско име от конфигурирания мениджър за удостоверяване |
| текуща_база_данни() | низ | Връща името на текущата база данни |
| md5(низ/двоичен) | низ | Връща MD5 128-битовата контролна сума като низ от 32 шестнадесетични цифри или NULL за NULL аргумент |
| sha1(низ/двоичен) | низ | Връща SHA-1 дайджеста на аргумента като шестнадесетичен низ |
| crc32(низ/двоичен) | BIGINT | Връща стойността на проверката за циклична излишък на низ или двоичен аргумент |
| версия() | низ | Връща версията на Hive като номер на компилация, последван от хеш на компилацията |
| отразявам(клас, метод[, arg1…]) | варира | Обаждания Java метод чрез съпоставяне на сигнатурата на аргумента, използвайки отражение. java_method() е синоним |
UDF (дефинирани от потребителя функции)
В Hive потребителите могат да дефинират свои собствени функции, за да отговорят на определени изисквания на клиента. Те са известни като UDF в Hive. Потребителски дефинираните функции са написани на Java за конкретни модули.
Някои UDF са специално проектирани за повторна употреба на код в приложни рамки. Разработчикът пише тези функции в Java и интегрира тези UDF с Hive.
По време на изпълнение на заявка, разработчикът може директно да използва кода, а UDF ще връщат резултати според дефинираните от потребителя задачи. Това осигурява висока производителност по отношение на кодирането и изпълнението.
Например, за определяне на низове чрез stemming нямаме предварително дефинирана функция в Hive. За тази цел можем да напишем stem UDF в JavaКъдето и да се нуждаем от функционалност на stem, можем директно да извикаме тази UDF на stem в Hive.
Тук функционалността на стема означава извличане на думи от техните коренни думи. Алгоритъмът за стеминг редуцира думите „wishing“, „wished“ и „wishes“ до коренната дума „wish“. За изпълнението на този тип функционалност можем да напишем UDF в Java и го интегрирайте с Кошер.
В зависимост от случая на употреба, UDF може да бъде написана да приема и генерира различен брой входни и изходни стойности.
Общият тип UDF ще приема една входна стойност и ще генерира една изходна стойност. Ако UDF се използва в заявка, тогава UDF ще бъде извикана веднъж за всеки ред в резултатния набор от данни.
В другата посока, функцията може да приема група стойности като вход и да връща една изходна стойност. Тази разлика е това, което разделя трите типа персонализирани функции, описани по-долу.
UDF срещу UDAF срещу UDTF в Hive
Персонализираните функции в Hive са групирани по броя на въведените и броя на изведените редове. Изборът на грешен тип е най-честата причина, поради която персонализирана функция отказва да се компилира или връща един ред там, където се очаква таблица.
| Тип | Входящи редове → излизащи редове | Клас за разширяване | Вградени примери |
|---|---|---|---|
| СДС | Един ред → един ред | org.apache.hadoop.hive.ql.exec.UDF | дължина(), закръгляване(), обръщане() |
| УДАФ | Много редове → един ред | org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver | брой(), мин(), макс() |
| UDTF | Един ред → много редове | org.apache.hadoop.hive.ql.udf.generic.GenericUDTF | експлодира(), json_tuple(), parse_url_tuple() |
От таблицата следват две практични правила:
- UDAF почти винаги се свързва с клауза GROUP BY, защото тя свива всяка група до един ред.
- UDTF не може да бъде избран заедно с други колони в същия SELECT списък, така че обикновено се използва с LATERAL VIEW.
Съществува и втори, по-способен базов клас за работа на ниво ред, GenericUDF, който приема сложни типове като масиви, карти и структури, както и променлив брой аргументи.
Как да напишете и регистрирате UDF в Hive
Примерът със стволови функции, описан по-горе, може да бъде изграден като реална функция в четири стъпки. Нищо повече от Java Изисква се компилатор и работеща Hive сесия.
Стъпка 1) Напиши Java клас, който разширява UDF и имплементира публичен метод evaluate(). Hive извиква evaluate() веднъж на ред, така че методът трябва да обработва NULL вход.
package com.guru99.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public final class Stem extends UDF { public Text evaluate(final Text input) { if (input == null) { return null; } String word = input.toString().toLowerCase(); if (word.endsWith("ing")) { word = word.substring(0, word.length() - 3); } else if (word.endsWith("ed") || word.endsWith("es")) { word = word.substring(0, word.length() - 2); } return new Text(word); } }
Стъпка 2) Компилирайте класа и го пакетирайте в JAR файл, например hive-udf-1.0.jar, заедно с всички класове, от които зависи.
Стъпка 3) Поставете JAR файла в пътя на класовете на Hive и обвържете име на функция с класа. Временната функция е валидна само за текущата сесия.
ADD JAR /home/hduser/hive-udf-1.0.jar; CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';
Стъпка 4) Извикайте новата функция точно като вградена. Приложена към думите „wishing“, „wished“ и „wishes“, този клас връща „wish“ и за трите.
SELECT word, stem(word) FROM words;
За да запазите функцията достъпна за всяка сесия и всеки потребител, регистрирайте я постоянно в база данни. JAR файлът трябва да се намира на път, който целият клъстер може да прочете, което обикновено означава HDFS.
CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem' USING JAR '/user/hive/udfs/hive-udf-1.0.jar';
Един клас може да декларира повече от един метод evaluate(). Hive сравнява извикването с сигнатурите на аргументите, което е начинът, по който една функция може да приема както низ, така и цяло число.

