Функции на Hive: Пример за вградени и UDF (потребителски дефинирани)

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

Функциите на Hive се разделят на две групи: вградени функции, които се доставят с енджина и обхващат колекции, дати, математически, условни, низови и разни задачи, и потребителски дефинирани функции, написани на Java за логика Hive не предоставя.

  • ???? Шест вградени семейства: Функциите за колекции, дати, математически, условни, низови и разни функции могат да се извикват директно в HiveQL.
  • 🧾 Подписите са важни: Всяка функция има фиксиран списък с аргументи и документиран тип на връщане, така че типът на връщане определя къде може да се използва.
  • 🧩 СДС запълва празнините: Когато не съществува вградена функция, a Java Класът, разширяващ org.apache.hadoop.hive.ql.exec.UDF, предоставя липсващата операция.
  • 🔢 Три форми на персонализирана функция: UDF връща по един ред на ред, UDAF свива много редове в един, а UDTF разширява един ред в много.
  • 🛠️ Регистрация в две стъпки: ADD JAR поставя кода в пътя на класа, а CREATE TEMPORARY FUNCTION свързва име с класа.
  • Повторната употреба е смисълът: Една тествана UDF, като например stemmer, може да бъде извикана от всяка заявка, вместо да бъде пренаписвана всеки път.

Функции на 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 сравнява извикването с сигнатурите на аргументите, което е начинът, по който една функция може да приема както низ, така и цяло число.

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

SHOW FUNCTIONS изброява всяко регистрирано име, включително персонализираните. DESCRIBE FUNCTION име отпечатва едноредов подпис, а DESCRIBE FUNCTION EXTENDED име добавя примери за употреба, където имплементиращият клас ги предоставя.

Почти винаги проблем с името или обхвата: низът след AS трябва да бъде пълното име на класа, а ADD JAR се отнася само за сесията, която го е изпълнила. Повторното свързване премахва както JAR файла, така и всяка временна функция.

Използвайте GenericUDF, когато функцията приема сложни типове като масиви, карти или структури, променлив брой аргументи или трябва сама да валидира типовете аргументи. Простият UDF клас разрешава типовете чрез отражение и обработва само примитивни Writables.

Истинската UDF трябва да работи на JVM. За други езици, Кошер предлага клаузата TRANSFORM, която предава всеки ред през външен скрипт, като например Python в сравнение със стандартния вход и изход. По-бавно е, но избягва Java изцяло.

Те могат. evaluate() се изпълнява веднъж на ред, така че скъпата логика се умножава по броя на редовете, а разпределението на обекти вътре в метода добавя напрежение от събиране на боклук. Предпочитайте вградена функция, когато има такава, и дръжте evaluate() свободна от I/O.

Не. Имената на функциите се разрешават без значение от главните и малките букви, така че ROUND(), Round() и round() са една и съща функция. Java Името на класа в AS клаузата е различен въпрос и трябва да съвпада точно с компилирания клас, включително неговия пакет.

Асистентите за машинно обучение съпоставят описание на разбираем език с кандидат-сигнатури и предупреждават, когато типът на връщане не се вписва в целевата колона. Проверете предложението спрямо документираната сигнатура, тъй като генерираните имена понякога принадлежат на друг SQL диалект.

Той създава използваем скелет — декларацията на класа, импортирането и метода evaluate() — от коментар, описващ операцията. Обработката на Null, типовете за запис и стъпката на опаковане все още се нуждаят от преглед, а функцията трябва да бъде тествана върху реални редове.

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