Hive funkcije: Primjer ugrađenih i UDF (korisnički definiranih) funkcija
⚡ Pametni sažetak
Hive funkcije se dijele u dvije skupine: ugrađene funkcije koje dolaze s engineom i pokrivaju kolekcije, datume, matematičke, uvjetne, string i razne poslove, te korisnički definirane funkcije napisane u Java za logiku koju Hive ne nudi.
Funkcije su izgrađene za određenu svrhu za izvođenje operacija poput matematičkih, aritmetičkih, logičkih i relacijskih operacija na operandima naziva stupaca tablice.
Ugrađene funkcije
Ovo su funkcije koje su već dostupne u Hiveu. Prvo moramo provjeriti zahtjeve aplikacije, a zatim možemo koristiti ove ugrađene funkcije u našim aplikacijama. Ove funkcije možemo pozvati izravno u našoj aplikaciji.
Sintaksa i tipovi navedeni su u sljedećem odjeljku.
Vrste ugrađenih funkcija u Hiveu:
- Funkcije prikupljanja
- Datumske funkcije
- Matematičke funkcije
- Uvjetne funkcije
- Funkcije nizova
- Razno. Funkcije
Svaka od šest obitelji obrađena je u nastavku sa svojim potpisima funkcija i tipovima povrata.
Funkcije prikupljanja
Ove funkcije se koriste za kolekcije. Kolekcije znače grupuping elemenata, a vraćaju jedan element ili niz elemenata ovisno o tipu povrata spomenutom u nazivu funkcije.
| Tip povrata | Naziv funkcije | Description |
|---|---|---|
| INT | veličina (karta ) | Dohvatit će i dati broj komponenti u tipu mape |
| INT | veličina (niz ) | Dohvatit će i dati broj elemenata u tipu polja |
| Niz | ključevi_mape(Karta ) | Dohvatit će i vratiti niz koji sadrži ključeve ulazne mape. Niz je neuređen. |
| Niz | vrijednosti_karte(Karta ) | Dohvatit će i vratiti niz koji sadrži vrijednosti ulazne mape. Niz je neuređen. |
| Niz | sort_array(Niz ) | Sortira ulazni niz u rastućem redoslijedu elemenata i vraća ga |
| Booleova | niz_sadrži(Niz , vrijednost) | Vraća TRUE ako niz sadrži vrijednost proslijeđenu kao drugi argument |
Datumske funkcije
Koriste se za manipulaciju datumima i pretvorbu tipova datuma iz jednog tipa u drugi:
| Naziv funkcije | Tip povrata | Description |
|---|---|---|
| unix_timestamp() | BIGINT | Dobit ćemo struju Unix vremenska oznaka u sekundama. Vrijednost nije fiksna za cijeli upit |
| datum_do(niz_vremenske_oznake) | podaci | Dohvatit će i dati datumski dio vremenskog pečata |
| godina (string datum) | INT | Dohvatit će i dati godinu kao dio datuma ili niza vremenske oznake |
| kvartal(datum/vremenska oznaka/niz) | INT | Dohvatit će i dati kvartal u godini za datum, vremensku oznaku ili niz u rasponu od 1 do 4 |
| mjesec (string datum) | INT | Dat će mjesecu dio datuma ili niz vremenske oznake |
| sat (string datum) | INT | Dohvatit će i dati sat vremenske oznake |
| minuta (string datum) | INT | Dohvatit će i dati minutu vremenske oznake |
| date_sub(string početni datum, cijeli broj dana) | podaci | Dohvatit će i dati rezultat podređenogtracnekoliko dana od početnog datuma |
| trenutni_datum | podaci | Dohvatit će i dati trenutni datum na početku evaluacije upita |
| zadnji_dan(niz znakova datuma) | niz | Dohvatit će i dati posljednji dan u mjesecu kojem datum pripada |
| trunc(datum niza, format niza) | niz | Dohvatit će i vratiti datum skraćen na jedinicu određenu formatom. Podržani formati: MJESEC/MON/MM, GODINA/GGGG/GG. |
Matematičke funkcije
Ove se funkcije koriste za matematičke operacije. Umjesto stvaranja UDF-ova, u Hiveu imamo neke ugrađene matematičke funkcije.
| Naziv funkcije | Tip povrata | Description |
|---|---|---|
| okruglo (DOUBLE X) | DVOSTRUKO | Dohvatit će i vratiti zaokruženu BIGINT vrijednost X-a. |
| okruglo (DOUBLE X, INT d) | DVOSTRUKO | Dohvatit će i vratiti X zaokruženo na d decimalnih mjesta |
| smeđa (DOUBLE X) | DVOSTRUKO | Dohvatit će i vratiti zaokruženu BIGINT vrijednost X koristeći HALF_EVEN način zaokruživanja, također poznat kao bankarsko zaokruživanje. |
| kat (DOUBLE X) | BIGINT | Dohvatit će i vratiti maksimalnu BIGINT vrijednost koja je jednaka ili manja od X vrijednosti. |
| strop (DOUBLE a), strop (DOUBLE a) | BIGINT | Dohvatit će i vratiti minimalnu BIGINT vrijednost koja je jednaka ili veća od vrijednosti a |
| rand(), rand(INT sjeme) | DVOSTRUKO | Dohvatit će i vratiti slučajni broj koji je jednoliko raspoređen od 0 do 1. Navođenje početne vrijednosti čini niz ponovljivim. |
Uvjetne funkcije
Ove funkcije se koriste za provjeru uvjetnih vrijednosti.
| Naziv funkcije | Tip povrata | Description |
|---|---|---|
| if(Boolean testCondition, T valueTrue, T valueFalseOrNull) | T | Vratit će vrijednost valueTrue kada je testCondition istinit, a u suprotnom vrijednost valueFalseOrNull. |
| nije null(X) | Booleova | Dohvatit će i vratiti vrijednost true ako je X NULL, a u suprotnom će vratiti vrijednost false. |
| nije null(X) | Booleova | Dohvatit će i vratiti vrijednost true ako X nije NULL, a u suprotnom će vratiti vrijednost false. |
| nvl(T vrijednost, T zadana_vrijednost) | T | Vratit će default_value kada je value NULL, a value inače. |
Funkcije nizova
Manipulacije stringova i operacije s stringovima obrađuju se sljedećim funkcijama.
| Naziv funkcije | Tip povrata | Description |
|---|---|---|
| obrnuto(niz X) | niz | To će dati obrnuti niz X |
| rpad(string str, int duljina, string pad) | niz | Dohvatit će i dati str desno dopunjen s dopunom do ukupne duljine length |
| rtrim(niz znakova X) | niz | Dohvatit će i vratiti niz koji je rezultat obrezivanja razmaka s kraja (desne strane) X-a. Na primjer, rtrim(' rezultati ') rezultira ' rezultatima' |
| razmak (INT n) | niz | Dohvatit će i dati niz od n razmaka. |
| split(STRING str, STRING pat) | poredak | Rastavlja str oko pat (pat je regularni izraz). |
| str_u_mapu(tekst[, delimiter1, delimiter2]) | karta | Podijelit će tekst na parove ključ-vrijednost pomoću dva razdjelnika. Razdjelnik1 odvaja parove, a razdjelnik2 dijeli svaki par. |
Razno. Funkcije
Nekoliko ugrađenih funkcija ne pripada nijednoj od gore navedenih obitelji. One obuhvaćaju hashiranje, informacije o sesiji i pozivanje proizvoljnih Java metode.
| Naziv funkcije | Tip povrata | Description |
|---|---|---|
| hash(a1[, a2…]) | INT | Vraća hash vrijednost argumenata |
| trenutni_korisnik() | niz | Vraća trenutno korisničko ime iz konfiguriranog upravitelja autentifikatora |
| trenutna_baza_podataka() | niz | Vraća naziv trenutne baze podataka |
| md5(niz/binarni) | niz | Vraća MD5 128-bitnu kontrolnu sumu kao niz od 32 heksadecimalne znamenke ili NULL za NULL argument |
| sha1(niz znakova/binarna datoteka) | niz | Vraća SHA-1 sažetak argumenta kao heksadecimalni niz |
| crc32(niz/binarni) | BIGINT | Vraća vrijednost cikličke provjere redundancije niza znakova ili binarnog argumenta |
| verzija() | niz | Vraća verziju Hivea kao broj verzije nakon kojeg slijedi hash verzije |
| odražavati(klasa, metoda[, arg1…]) | varira | Pozivi Java metoda usklađivanjem potpisa argumenta, korištenjem refleksije. java_method() je sinonim |
UDF-ovi (korisnički definirane funkcije)
U Hiveu korisnici mogu definirati vlastite funkcije kako bi zadovoljili određene zahtjeve klijenta. One su u Hiveu poznate kao UDF-ovi. Korisnički definirane funkcije napisane su u Java za određene module.
Neki UDF-ovi su posebno dizajnirani za ponovnu upotrebu koda u aplikacijskim okvirima. Programer piše ove funkcije u Java i integrira te UDF-ove s Hiveom.
Tijekom izvršavanja upita, programer može izravno koristiti kod, a UDF-ovi će vraćati izlaze prema korisnički definiranim zadacima. To pruža visoke performanse u smislu kodiranja i izvršavanja.
Na primjer, za stemming stringova nemamo unaprijed definiranu funkciju u Hiveu. Za to možemo napisati stem UDF u JavaGdje god nam je potrebna funkcionalnost stema, možemo izravno pozvati ovaj UDF stema u Hiveu.
Ovdje funkcionalnost korijena znači izvođenje riječi iz njihovih korijenskih riječi. Algoritam za izvođenje korijena reducira riječi „željeti“, „želio“ i „želi“ na korijensku riječ „želja“. Za izvođenje ove vrste funkcionalnosti možemo napisati UDF u Java i integrirati ga sa Košnica.
Ovisno o slučaju upotrebe, UDF se može napisati tako da prihvaća i proizvodi različit broj ulaznih i izlaznih vrijednosti.
Opći tip UDF-a prihvaća jednu ulaznu vrijednost i proizvodi jednu izlaznu vrijednost. Ako se UDF koristi u upitu, tada će se UDF pozvati jednom za svaki redak u skupu rezultata podataka.
U drugom smjeru, funkcija može prihvatiti skupinu vrijednosti kao ulaz i vratiti jednu izlaznu vrijednost. Ta razlika je ono što razdvaja tri vrste prilagođenih funkcija opisanih u nastavku.
UDF vs UDAF vs UDTF u Hiveu
Prilagođene funkcije u Hiveu grupirane su prema broju redaka koji ulaze i koliko izlaze. Odabir pogrešnog tipa najčešći je razlog zašto prilagođena funkcija odbija kompajlirati ili vraća jedan redak tamo gdje se očekivala tablica.
| Tip | Redovi unutra → redovi van | Klasa za proširenje | Ugrađeni primjeri |
|---|---|---|---|
| UDF | Jedan red → jedan red | org.apache.hadoop.hive.ql.exec.UDF | duljina(), zaokruživanje(), obrnuto() |
| UDAF | Više redaka → jedan redak | org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver | broj(), min(), maks() |
| UDTF | Jedan red → više redova | org.apache.hadoop.hive.ql.udf.generic.GenericUDTF | explode(), json_tuple(), parse_url_tuple() |
Iz tablice slijede dva praktična pravila:
- UDAF je gotovo uvijek uparen s klauzulom GROUP BY jer sažima svaku grupu u jedan redak.
- UDTF se ne može odabrati uz druge stupce u istoj SELECT listi, pa se obično koristi s LATERAL VIEW-om.
Postoji i druga, sposobnija osnovna klasa za rad na razini redova, GenericUDF, koja prihvaća složene tipove poput nizova, mapa i struktura te varijabilan broj argumenata.
Kako napisati i registrirati UDF u Hiveu
Primjer stema opisan gore može se izgraditi kao stvarna funkcija u četiri koraka. Ništa više od Java potreban je kompajler i pokrenuta Hive sesija.
Korak 1) Napiši a Java klasa koja proširuje UDF i implementira javnu metodu evaluate(). Hive poziva evaluate() jednom po retku, tako da metoda mora obraditi NULL ulaz.
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); } }
Korak 2) Kompajlirajte klasu i zapakirajte je u JAR datoteku, na primjer hive-udf-1.0.jar, zajedno sa svim klasama o kojima ovisi.
Korak 3) Stavite JAR na put klase Hive i vežite naziv funkcije za klasu. Privremena funkcija traje samo tijekom trenutne sesije.
ADD JAR /home/hduser/hive-udf-1.0.jar; CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';
Korak 4) Pozovite novu funkciju točno kao ugrađenu. Primijenjena na riječi "wishing", "wished" i "wishes", ova klasa vraća "wish" za sve tri.
SELECT word, stem(word) FROM words;
Da bi funkcija ostala dostupna svakoj sesiji i svakom korisniku, umjesto toga je trajno registrirajte u bazi podataka. JAR mora biti na putanji koju cijeli klaster može pročitati, što obično znači HDFS.
CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem' USING JAR '/user/hive/udfs/hive-udf-1.0.jar';
Jedna klasa može deklarirati više od jedne metode evaluate(). Hive uspoređuje poziv s potpisima argumenata, što znači da jedna funkcija može prihvatiti i niz znakova i cijeli broj.

