Hive-funktioner: Inbyggt och UDF (användardefinierat) exempel
⚡ Smart sammanfattning
Hive-funktioner delas in i två grupper: inbyggda funktioner som levereras med motorn och täcker samling, datum, matematiskt, villkorligt, sträng- och diverse arbete, och användardefinierade funktioner skrivna i Java för logik tillhandahåller Hive inte.
Funktioner är byggda för ett specifikt syfte för att utföra operationer som matematiska, aritmetiska, logiska och relationella operationer på operanderna i tabellkolumnnamn.
Inbyggda funktioner
Det här är funktioner som redan är tillgängliga i Hive. Först måste vi kontrollera applikationskravet, och sedan kan vi använda dessa inbyggda funktioner i våra applikationer. Vi kan anropa dessa funktioner direkt i vår applikation.
Syntaxen och typerna nämns i följande avsnitt.
Typer av inbyggda funktioner i Hive:
- Insamlingsfunktioner
- Datumfunktioner
- Matematiska funktioner
- Villkorliga funktioner
- Strängfunktioner
- Övrigt Funktioner
Var och en av de sex familjerna behandlas nedan med sina funktionssignaturer och returtyper.
Insamlingsfunktioner
Dessa funktioner används för samlingar. Samlingar betyder gruppenping av element, och de returnerar ett enskilt element eller en array av element beroende på returtypen som anges i funktionsnamnet.
| Returtyp | Funktionsnamn | BESKRIVNING |
|---|---|---|
| INT | storlek (karta ) | Den hämtar och anger antalet komponenter i karttypen |
| INT | storlek (Array ) | Den hämtar och anger antalet element i arraytypen |
| Array | map_nycklar(Karta ) | Den kommer att hämta och ge en array som innehåller nycklarna till inmatningskartan. Arrayen är oordnad. |
| Array | map_values(Karta ) | Den hämtar och ger en array som innehåller värdena från inmatningskartan. Arrayen är oordnad. |
| Matris | sorteringsmatris(Matris ) | Sorterar inmatningsmatrisen i stigande ordning efter dess element och returnerar den |
| Boolean | array_innehåller(Array , värde) | Returnerar SANT om arrayen innehåller värdet som skickats som det andra argumentet |
Datumfunktioner
Dessa används för att utföra datummanipulationer och konvertering av datumtyper från en typ till en annan:
| Funktionsnamn | Returtyp | BESKRIVNING |
|---|---|---|
| unix_tidsstämpel() | bigint | Vi kommer att få strömmen Unix tidsstämpel i sekunder. Värdet är inte fast för hela frågan |
| till_datum(sträng tidsstämpel) | datum | Den hämtar och ger datumdelen av en tidsstämpelsträng |
| år (strängdatum) | INT | Det kommer att hämta och ge året en del av ett datum eller en tidsstämpelsträng |
| kvartal (datum/tidsstämpel/sträng) | INT | Den hämtar och ger årets kvartal för ett datum, en tidsstämpel eller en sträng i intervallet 1 till 4 |
| månad (strängdatum) | INT | Det kommer att ge månaden en del av ett datum eller en tidsstämpelsträng |
| timme (strängdatum) | INT | Den kommer att hämta och ge timmen för tidsstämpeln |
| minut (strängdatum) | INT | Den kommer att hämta och ge minut för tidsstämpeln |
| date_sub(sträng startdatum, heltal dagar) | datum | Den kommer att hämta och ge resultatet av subtracett antal dagar från startdatumet |
| aktuellt_datum | datum | Den hämtar och anger aktuellt datum i början av utvärderingen av frågan. |
| sista_dagen(strängdatum) | sträng | Den hämtar och anger den sista dagen i den månad som datumet tillhör |
| trunc(strängdatum, strängformat) | sträng | Den hämtar och ger datumet avkortat till den enhet som anges av formatet. Stödda format: MÅNAD/MÅN/MM, ÅR/ÅÅÅÅ/ÅÅ. |
Matematiska funktioner
Dessa funktioner används för matematiska operationer. Istället för att skapa UDF:er har vi några inbyggda matematiska funktioner i Hive.
| Funktionsnamn | Returtyp | BESKRIVNING |
|---|---|---|
| rund (DOUBLE X) | DUBBEL | Den hämtar och returnerar det avrundade BIGINT-värdet för X |
| rund (DOUBLE X, INT d) | DUBBEL | Den hämtar och returnerar X avrundat till d decimaler |
| rund (DOUBLE X) | DUBBEL | Den hämtar och returnerar det avrundade BIGINT-värdet för X med hjälp av HALF_EVEN-avrundningsläget, även känt som bankirs avrundning. |
| golv (DUBBLA X) | STORT | Den hämtar och returnerar det maximala BIGINT-värdet som är lika med eller mindre än X-värdet. |
| tak(DOUBLE a), tak(DOUBLE a) | STORT | Den hämtar och returnerar det minsta BIGINT-värdet som är lika med eller större än a-värdet |
| rand(), rand(INT-frö) | DUBBEL | Den hämtar och returnerar ett slumptal som är jämnt fördelat från 0 till 1. Att ange ett frö gör sekvensen repeterbar. |
Villkorliga funktioner
Dessa funktioner används för villkorliga värdekontroller.
| Funktionsnamn | Returtyp | BESKRIVNING |
|---|---|---|
| if(Booleskt testvillkor, T värdeTrue, T värdeFalseEllerNull) | T | Den ger valueTrue när testCondition är sant, och valueFalseOrNull annars. |
| ärnull(X) | Boolean | Den hämtar och ger sant om X är NULL och annars falskt. |
| är inte null(X) | Boolean | Den hämtar och ger sant om X inte är NULL och annars falskt. |
| nvl(T-värde, T standardvärde) | T | Den kommer att ge default_value när värdet är NULL, och värde annars. |
Strängfunktioner
Strängmanipulationer och strängoperationer hanteras av följande funktioner.
| Funktionsnamn | Returtyp | BESKRIVNING |
|---|---|---|
| omvänd (sträng X) | sträng | Det kommer att ge den omvända strängen av X |
| rpad(string str, int length, string pad) | sträng | Den hämtar och ger en högerfylld längd med utfyllnad till en total längd av längd |
| rtrim(sträng X) | sträng | Den hämtar och returnerar strängen som är resultatet av att trimma mellanslag från slutet (höger sida) av X. Till exempel, rtrim(' resultat ') resulterar i ' resultat' |
| mellanslag(INT n) | sträng | Den kommer att hämta och ge en sträng med n mellanslag. |
| split(STRING str, STRING pat) | array | Delar str runt pat (pat är ett reguljärt uttryck). |
| str_to_map(text[, avgränsare1, avgränsare2]) | karta | Den delar upp text i nyckel-värde-par med hjälp av två avgränsare. Avgränsare1 separerar paren och avgränsare2 delar varje par. |
Övrigt Funktioner
Flera inbyggda funktioner tillhör ingen av familjerna ovan. Dessa täcker hashing, sessionsinformation och godtyckliga anrop. Java metoder.
| Funktionsnamn | Returtyp | BESKRIVNING |
|---|---|---|
| hash(a1[, a2…]) | INT | Returnerar ett hashvärde för argumenten |
| aktuell_användare() | sträng | Returnerar det aktuella användarnamnet från den konfigurerade autentiseringshanteraren |
| aktuell_databas() | sträng | Returnerar namnet på den aktuella databasen |
| md5(sträng/binär) | sträng | Returnerar MD5 128-bitars kontrollsumman som en sträng med 32 hexadecimalsiffror, eller NULL för ett NULL-argument |
| sha1(sträng/binär) | sträng | Returnerar SHA-1-sammanfattningen av argumentet som en hexagonsträng |
| crc32(sträng/binär) | bigint | Returnerar det cykliska redundanskontrollvärdet för en sträng eller ett binärt argument |
| version() | sträng | Returnerar Hive-versionen som ett buildnummer följt av en build-hash |
| reflektera(klass, metod[, arg1…]) | varierar | Samtalar en Java metod genom att matcha argumentsignaturen med hjälp av reflektion. java_method() är en synonym |
UDF:er (användardefinierade funktioner)
I Hive kan användare definiera sina egna funktioner för att uppfylla vissa klientkrav. Dessa kallas UDF:er i Hive. Användardefinierade funktioner skrivs i Java för specifika moduler.
Vissa UDF:er är specifikt utformade för återanvändbarhet av kod i applikationsramverk. Utvecklaren skriver dessa funktioner i Java och integrerar dessa UDF:er med Hive.
Under exekvering av frågeformuläret kan utvecklaren använda koden direkt, och UDF:er returnerar utdata enligt de användardefinierade uppgifterna. Det ger hög prestanda vad gäller kodning och exekvering.
Till exempel, för strängstemning har vi ingen fördefinierad funktion i Hive. För detta kan vi skriva en stam-UDF i JavaÖverallt där vi behöver stamfunktionalitet kan vi direkt anropa denna stam-UDF i Hive.
Här betyder stamfunktionalitet att härleda ord från deras rotord. En stamningsalgoritm reducerar orden "wishing", "wished" och "wishes" till rotordet "wish". För att utföra denna typ av funktionalitet kan vi skriva en UDF i Java och integrera den med Bikupa.
Beroende på användningsfallet kan UDF:n skrivas för att acceptera och producera olika antal in- och utdatavärden.
Den allmänna typen av UDF accepterar ett enda indatavärde och producerar ett enda utdatavärde. Om UDF:n används i en fråga anropas UDF:n en gång för varje rad i resultatdatauppsättningen.
Å andra sidan kan en funktion acceptera en grupp värden som indata och returnera ett enda utdatavärde. Det är den skillnaden som skiljer de tre anpassade funktionstyperna som beskrivs härnäst åt.
UDF vs UDAF vs UDTF i Hive
Anpassade funktioner i Hive grupperas efter hur många rader som ska in och hur många som ska ut. Att välja fel typ är den vanligaste anledningen till att en anpassad funktion vägrar att kompileras eller returnerar en enda rad där en tabell förväntades.
| Typ | Rader in → rader ut | Klass att förlänga | Inbyggda exempel |
|---|---|---|---|
| UDF | En rad → en rad | org.apache.hadoop.hive.ql.exec.UDF | längd(), rund(), omvänd() |
| UDAF | Många rader → en rad | org.apache.hadoop.hive.ql.udf.generic.AbstractGeneriskUDAF-lösare | count(), min(), max() |
| UDTF | En rad → många rader | org.apache.hadoop.hive.ql.udf.generic.GenericUDTF | explode(), json_tuple(), parse_url_tuple() |
Två praktiska regler följer av tabellen:
- En UDAF paras nästan alltid ihop med en GROUP BY-klausul, eftersom den komprimerar varje grupp till en rad.
- En UDTF kan inte väljas tillsammans med andra kolumner i samma SELECT-lista, så den används normalt med en LATERAL VIEW.
Det finns också en andra, mer kapabel basklass för arbete på radnivå, GenericUDF, som accepterar komplexa typer som arrayer, kartor och strukturer samt ett variabelt antal argument.
Hur man skriver och registrerar en UDF i Hive
Stammexemplet som beskrivs ovan kan byggas som en reell funktion i fyra steg. Ingenting utöver en Java kompilator och en körande Hive-session krävs.
Steg 1) Skriv en Java klass som utökar UDF och implementerar en public evaluate()-metod. Hive anropar evaluate() en gång per rad, så metoden måste hantera en NULL-indata.
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); } }
Steg 2) Kompilera klassen och paketera den i en JAR-fil, till exempel hive-udf-1.0.jar, tillsammans med eventuella klasser den är beroende av.
Steg 3) Placera JAR-filen på Hive-klassvägen och bind ett funktionsnamn till klassen. En temporär funktion lever bara under den aktuella sessionen.
ADD JAR /home/hduser/hive-udf-1.0.jar; CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';
Steg 4) Anropa den nya funktionen precis som en inbyggd. Tillämpad på orden "wishing", "wished" och "wishes" returnerar den här klassen "wish" för alla tre.
SELECT word, stem(word) FROM words;
För att hålla funktionen tillgänglig för varje session och varje användare, registrera den permanent mot en databas istället. JAR-filen måste finnas på en sökväg som hela klustret kan läsa, vilket normalt innebär HDFS.
CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem' USING JAR '/user/hive/udfs/hive-udf-1.0.jar';
En enda klass kan deklarera mer än en evaluate()-metod. Hive matchar anropet mot argumentsignaturerna, vilket är hur en funktion kan acceptera både en sträng och ett heltal.

