Hive-funksjoner: Innebygd og UDF (brukerdefinert) eksempel
โก Smart oppsummering
Hive-funksjoner faller inn i to grupper: innebygde funksjoner som fรธlger med motoren og dekker samling, dato, matematisk, betinget, streng- og diverse arbeid, og brukerdefinerte funksjoner skrevet i Java for logikk leverer ikke Hive.

Funksjoner er bygget for et spesifikt formรฅl for รฅ utfรธre operasjoner som matematiske, aritmetiske, logiske og relasjonelle operasjoner pรฅ operandene til tabellkolonnenavn.
Innebygde funksjoner
Dette er funksjoner som allerede er tilgjengelige i Hive. Fรธrst mรฅ vi sjekke applikasjonskravet, og deretter kan vi bruke disse innebygde funksjonene i applikasjonene vรฅre. Vi kan kalle disse funksjonene direkte i vรฅr applikasjon.
Syntaksen og typene er nevnt i den fรธlgende delen.
Typer innebygde funksjoner i Hive:
- Innsamlingsfunksjoner
- Datofunksjoner
- Matematiske funksjoner
- Betingede funksjoner
- strengfunksjoner
- Diverse Funksjoner
Hver av de seks familiene er dekket nedenfor med sine funksjonssignaturer og returtyper.
Innsamlingsfunksjoner
Disse funksjonene brukes for samlinger. Samlinger betyr gruppenping av elementer, og de returnerer et enkelt element eller en matrise av elementer avhengig av returtypen som er nevnt i funksjonsnavnet.
| Returtype | Funksjonsnavn | Tekniske beskrivelser |
|---|---|---|
| INT | stรธrrelse (Kart ) | Den vil hente og gi antall komponenter i karttypen |
| INT | stรธrrelse (Array ) | Den vil hente og gi antall elementer i arraytypen |
| Array | kart_nรธkler(Kart ) | Den vil hente og gi en matrise som inneholder nรธklene til input-kartet. Matrisen er uordnet. |
| Array | kart_verdier(Kart ) | Den vil hente og gi en matrise som inneholder verdiene fra input-kartet. Matrisen er uordnet. |
| Matrise | sorteringsmatrise(Matrise ) | Sorterer input-arrayet i stigende rekkefรธlge etter elementene og returnerer det |
| boolean | array_contains(Array , verdi) | Returnerer SANN hvis arrayet inneholder verdien som sendes som det andre argumentet |
Datofunksjoner
Disse brukes til รฅ utfรธre datomanipulasjoner og konvertering av datotyper fra รฉn type til en annen type:
| Funksjonsnavn | Returtype | Tekniske beskrivelser |
|---|---|---|
| unix_tidsstempel() | bigint | Vi vil fรฅ strรธmmen Unix tidsstempel i sekunder. Verdien er ikke fast for hele spรธrringen |
| to_date(streng tidsstempel) | data | Den vil hente og gi datoen som en del av en tidsstempelstreng |
| รฅr (strengdato) | INT | Den vil hente og gi รฅret en del av en dato- eller tidsstempelstreng |
| kvartal(dato/tidsstempel/streng) | INT | Den vil hente og gi kvartalet av รฅret for en dato, et tidsstempel eller en streng i omrรฅdet 1 til 4 |
| mรฅned (strengdato) | INT | Det vil gi mรฅneden en del av en dato- eller tidsstempelstreng |
| time (strengdato) | INT | Den vil hente og gi timen pรฅ tidsstempelet |
| minutt (strengdato) | INT | Den vil hente og gi minuttet fra tidsstempelet |
| date_sub(streng startdato, int dager) | data | Den vil hente og gi resultatet av subtracet antall dager fra startdatoen |
| nรฅvรฆrende_dato | data | Den vil hente og gi gjeldende dato ved starten av spรธrreevalueringen. |
| siste_dag(streng dato) | string | Den vil hente og gi den siste dagen i mรฅneden som datoen tilhรธrer |
| trunc(strengdato, strengformat) | string | Den vil hente og gi datoen avkortet til enheten som er spesifisert i formatet. Stรธttede formater: Mร NED/Mร N/MM, ร R/ร ร ร ร /ร ร . |
Matematiske funksjoner
Disse funksjonene brukes til matematiske operasjoner. I stedet for รฅ opprette UDF-er, har vi noen innebygde matematiske funksjoner i Hive.
| Funksjonsnavn | Returtype | Tekniske beskrivelser |
|---|---|---|
| runde (DOUBLE X) | DOBBELT | Den vil hente og returnere den avrundede BIGINT-verdien av X |
| runde (DOUBLE X, INT d) | DOBBELT | Den vil hente og returnere X avrundet til d desimaler |
| rund (DOUBLE X) | DOBBELT | Den vil hente og returnere den avrundede BIGINT-verdien av X ved hjelp av HALF_EVEN-avrundingsmodus, ogsรฅ kjent som bankers avrunding. |
| etasje (DOUBLE X) | STORT | Den vil hente og returnere den maksimale BIGINT-verdien som er lik eller mindre enn X-verdien. |
| tak(DOUBLE a), tak(DOUBLE a) | STORT | Den vil hente og returnere den minste BIGINT-verdien som er lik eller stรธrre enn a-verdien |
| rand(), rand(INT frรธ) | DOBBELT | Den vil hente og returnere et tilfeldig tall som er jevnt fordelt fra 0 til 1. ร angi et frรธ gjรธr sekvensen repeterbar. |
Betingede funksjoner
Disse funksjonene brukes til kontroller av betingede verdier.
| Funksjonsnavn | Returtype | Tekniske beskrivelser |
|---|---|---|
| if(Boolsk testBetingelse, T-verdiSann, T-verdi UsannEllerNull) | T | Den vil gi valueTrue nรฅr testCondition er sann, og valueFalseOrNull ellers. |
| isnull(X) | boolean | Den vil hente og gi sann hvis X er NULL og usann ellers. |
| er ikke null(X) | boolean | Den vil hente og gi sann hvis X ikke er NULL og usann ellers. |
| nvl(T-verdi, T standardverdi) | T | Den vil gi default_value nรฅr verdien er NULL, og verdi ellers. |
strengfunksjoner
Strengmanipulasjoner og strengoperasjoner hรฅndteres av fรธlgende funksjoner.
| Funksjonsnavn | Returtype | Tekniske beskrivelser |
|---|---|---|
| omvendt (streng X) | string | Det vil gi den omvendte strengen av X |
| rpad (streng str, int lengde, streng pad) | string | Den vil hente og gi str hรธyrepolstret med pad til en total lengde pรฅ lengde |
| rtrim(streng X) | string | Den vil hente og returnere strengen som er et resultat av รฅ trimme mellomrom fra slutten (hรธyre side) av X. For eksempel, rtrim(' resultater ') resulterer i 'resultater' |
| mellomrom (INT n) | string | Den vil hente og gi en streng med n mellomrom. |
| del(STRING str, STRING klapp) | matrise | Deler str rundt pat (pat er et regulรฆrt uttrykk). |
| str_to_map(tekst[, skilletegn1, skilletegn2]) | kart | Den vil dele tekst inn i nรธkkelverdi-par ved hjelp av to skilletegn. Delimiter1 skiller parene og delimiter2 deler hvert par. |
Diverse Funksjoner
Flere innebygde funksjoner tilhรธrer ingen av familiene ovenfor. Disse dekker hashing, รธktinformasjon og vilkรฅrlig kalling. Java metoder.
| Funksjonsnavn | Returtype | Tekniske beskrivelser |
|---|---|---|
| hash(a1[, a2โฆ]) | INT | Returnerer en hash-verdi av argumentene |
| nรฅvรฆrende_bruker() | string | Returnerer gjeldende brukernavn fra den konfigurerte autentiseringsbehandleren |
| gjeldende_database() | string | Returnerer navnet pรฅ den gjeldende databasen |
| md5(streng/binรฆr) | string | Returnerer MD5 128-biters kontrollsummen som en streng med 32 heksadesimale sifre, eller NULL for et NULL-argument |
| sha1(streng/binรฆr) | string | Returnerer SHA-1-sammendraget av argumentet som en heksadesimal streng |
| crc32(streng/binรฆr) | bigint | Returnerer den sykliske redundanskontrollverdien for en streng eller et binรฆrt argument |
| versjon() | string | Returnerer Hive-versjonen som et build-nummer etterfulgt av en build-hash |
| reflekter(klasse, metode[, arg1โฆ]) | varierer | Kaller en Java metode ved รฅ matche argumentsignaturen ved hjelp av refleksjon. java_method() er et synonym |
UDFer (brukerdefinerte funksjoner)
I Hive kan brukere definere sine egne funksjoner for รฅ oppfylle bestemte klientkrav. Disse er kjent som UDF-er i Hive. Brukerdefinerte funksjoner er skrevet i Java for spesifikke moduler.
Noen UDF-er er spesielt utviklet for gjenbruk av kode i applikasjonsrammeverk. Utvikleren skriver disse funksjonene i Java og integrerer disse UDF-ene med Hive.
Under utfรธrelse av spรธrringen kan utvikleren bruke koden direkte, og UDF-er vil returnere utdata i henhold til de brukerdefinerte oppgavene. Dette gir hรธy ytelse nรฅr det gjelder koding og utfรธrelse.
For eksempel, for strengstemming har vi ingen forhรฅndsdefinert funksjon i Hive. For dette kan vi skrive en stem-UDF i JavaDer vi trenger stamfunksjonalitet, kan vi kalle denne stam-UDF-en direkte i Hive.
Her betyr stammefunksjonalitet รฅ utlede ord fra rotordene deres. En stammealgoritme reduserer ordene ยซwishingยป, ยซwishedยป og ยซwishesยป til rotordet ยซwishยป. For รฅ utfรธre denne typen funksjonalitet kan vi skrive en UDF i Java og integrere den med Hive.
Avhengig av brukstilfellet kan UDF-en skrives til รฅ akseptere og produsere forskjellige antall inn- og utgangsverdier.
Den generelle typen UDF vil godta รฉn enkelt inngangsverdi og produsere รฉn enkelt utgangsverdi. Hvis UDF-en brukes i en spรธrring, vil UDF-en bli kalt รฉn gang for hver rad i resultatdatasettet.
I den andre retningen kan en funksjon godta en gruppe verdier som input og returnere รฉn enkelt outputverdi. Det er denne forskjellen som skiller de tre tilpassede funksjonstypene som beskrives nedenfor.
UDF vs UDAF vs UDTF i Hive
Tilpassede funksjoner i Hive grupperes etter hvor mange rader som skal inn og hvor mange som skal ut. ร velge feil type er den vanligste grunnen til at en tilpasset funksjon nekter รฅ kompilere eller returnerer en enkelt rad der en tabell var forventet.
| typen | Rader inn โ rader ut | Klasse som skal utvides | Innebygde eksempler |
|---|---|---|---|
| UDF | รn rad โ รฉn rad | org.apache.hadoop.hive.ql.exec.UDF | lengde(), rund(), revers() |
| UDAF | Mange rader โ รฉn rad | org.apache.hadoop.hive.ql.udf.generic.AbstractGenerisk UDAF-lรธser | antall(), min(), maks() |
| UDTF | รn rad โ mange rader | org.apache.hadoop.hive.ql.udf.generic.GenericUDTF | eksplodere(), json_tuple(), parse_url_tuple() |
To praktiske regler fรธlger av tabellen:
- En UDAF er nesten alltid paret med en GROUP BY-klausul, fordi den kollapser hver gruppe ned til รฉn rad.
- En UDTF kan ikke velges sammen med andre kolonner i samme SELECT-liste, sรฅ den brukes vanligvis med en LATERAL VIEW.
Det finnes ogsรฅ en andre, mer kapabel basisklasse for arbeid pรฅ radnivรฅ, GenericUDF, som aksepterer komplekse typer som arrayer, kart og strukturer og et variabelt antall argumenter.
Slik skriver og registrerer du en UDF i Hive
Stammeeksemplet beskrevet ovenfor kan bygges som en reell funksjon i fire trinn. Ingenting utover en Java kompilator og en kjรธrende Hive-รธkt er nรธdvendig.
Trinn 1) Skriv en Java klasse som utvider UDF og implementerer en offentlig evaluate()-metode. Hive kaller evaluate() รฉn gang per rad, sรฅ metoden mรฅ hรฅndtere en NULL-inndata.
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); } }
Trinn 2) Kompiler klassen og pakk den inn i en JAR-fil, for eksempel hive-udf-1.0.jar, sammen med eventuelle klasser den er avhengig av.
Trinn 3) Plasser JAR-filen pรฅ Hive-klassestien og bind et funksjonsnavn til klassen. En midlertidig funksjon lever bare i gjeldende รธkt.
ADD JAR /home/hduser/hive-udf-1.0.jar; CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';
Trinn 4) Kall den nye funksjonen akkurat som en innebygd funksjon. Brukt pรฅ ordene ยซwishingยป, ยซwishedยป og ยซwishesยป, returnerer denne klassen ยซwishยป for alle tre.
SELECT word, stem(word) FROM words;
For รฅ holde funksjonen tilgjengelig for hver รธkt og hver bruker, registrer den permanent mot en database i stedet. JAR-filen mรฅ ligge pรฅ en bane som hele klyngen kan lese, noe som vanligvis betyr HDFS.
CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem' USING JAR '/user/hive/udfs/hive-udf-1.0.jar';
En enkelt klasse kan deklarere mer enn รฉn evaluate()-metode. Hive matcher kallet mot argumentsignaturene, og det er slik รฉn funksjon kan akseptere bรฅde en streng og et heltall.
