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.

  • ๐Ÿ“š Seks innebygde familier: Innsamlings-, dato-, matematiske, betingede, streng- og diverse funksjoner kan kalles direkte i HiveQL.
  • ๐Ÿงพ Signaturer er viktige: Hver funksjon har en fast argumentliste og en dokumentert returtype, sรฅ returtypen bestemmer hvor den kan brukes.
  • ๐Ÿงฉ UDF fyller hullene: Nรฅr det ikke finnes noen innebygd funksjon, en Java klassen som utvider org.apache.hadoop.hive.ql.exec.UDF leverer den manglende operasjonen.
  • ๐Ÿ”ข Tre former for tilpasset funksjon: UDF returnerer รฉn rad per rad, UDAF kollapser mange rader til รฉn, og UDTF utvider รฉn rad til mange.
  • ๐Ÿ› ๏ธ Registrering i to trinn: ADD JAR plasserer koden pรฅ klassestien og CREATE TEMPORARY FUNCTION binder et navn til klassen.
  • โ™ป๏ธ Gjenbruk er poenget: ร‰n testet UDF, for eksempel en stemmer, kan kalles fra hver spรธrring i stedet for รฅ bli skrevet pรฅ nytt hver gang.

Hive-funksjoner: Innebygde og brukerdefinerte funksjoner

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.

Spรธrsmรฅl og svar

VIS FUNKSJONER viser alle registrerte navn, inkludert egendefinerte navn. DESCRIBE FUNCTION navn skriver ut en signatur pรฅ รฉn linje, og DESCRIBE FUNCTION UTVIDET navn legger til brukseksempler der implementeringsklassen oppgir dem.

Nesten alltid et navn- eller omfangsproblem: strengen etter AS mรฅ vรฆre det fullstendig kvalifiserte klassenavnet, og ADD JAR gjelder bare for รธkten som kjรธrte den. Nรฅr du kobler til pรฅ nytt, slettes bรฅde JAR-filen og eventuelle midlertidige funksjoner.

Bruk GenericUDF nรฅr funksjonen tar komplekse typer som matriser, kart eller strukturer, et variabelt antall argumenter, eller trenger รฅ validere argumenttyper selv. Den enkle UDF-klassen lรธser typer ved refleksjon og hรฅndterer bare primitive skrivbare elementer.

En ekte UDF mรฅ kjรธre pรฅ JVM. For andre sprรฅk, Hive tilbyr TRANSFORM-klausulen, som strรธmmer hver rad gjennom et eksternt skript som Python over standard input og output. Den er tregere, men unngรฅr Java fullstendig.

De kan. evaluate() kjรธres รฉn gang per rad, slik at dyr logikk multipliseres med radantallet, og objektallokering inne i metoden legger til press for sรธppelinnsamling. Foretrekk en innebygd funksjon nรฅr en finnes, og hold evaluate() fri for I/O.

Nei. Funksjonsnavn lรธses uten รฅ skille mellom store og smรฅ bokstaver, sรฅ ROUND(), Round() og round() er den samme funksjonen. Java Klassenavnet i AS-klausulen er en annen sak og mรฅ samsvare nรธyaktig med den kompilerte klassen, inkludert pakken.

Maskinlรฆringsassistenter tilordner en beskrivelse i enkelt sprรฅk til kandidatsignaturer og advarer nรฅr en returtype ikke passer i mรฅlkolonnen. Bekreft forslaget mot den dokumenterte signaturen, fordi genererte navn noen ganger tilhรธrer en annen SQL-dialekt.

Den produserer et brukbart skjelett โ€“ klassedeklarasjonen, imports og en evaluate()-metode โ€“ fra en kommentar som beskriver operasjonen. Nullhรฅndtering, skrivbare typer og pakketrinnet trenger fortsatt gjennomgang, og funksjonen mรฅ testes pรฅ reelle rader.

Oppsummer dette innlegget med: