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.

  • 📚 Sex inbyggda familjer: Insamlings-, datum-, matematiska, villkorliga, sträng- och diverse funktioner kan anropas direkt inuti HiveQL.
  • 🧾 Signaturer spelar roll: Varje funktion har en fast argumentlista och en dokumenterad returtyp, så returtypen avgör var den kan användas.
  • 🧩 UDF fyller luckorna: När ingen inbyggd funktion finns, en Java klassen som utökar org.apache.hadoop.hive.ql.exec.UDF tillhandahåller den saknade operationen.
  • 🔢 Tre former av anpassad funktion: UDF returnerar en rad per rad, UDAF komprimerar många rader till en och UDTF expanderar en rad till många.
  • 🛠️ Registrering i två steg: ADD JAR placerar koden på klassvägen och CREATE TEMPORARY FUNCTION binder ett namn till klassen.
  • ♻️ Återanvändning är poängen: En testad UDF, till exempel en stemmer, kan anropas från varje fråga istället för att skrivas om varje gång.

Hive-funktioner: Inbyggda och användardefinierade funktioner

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.

Vanliga frågor

SHOW FUNCTIONS listar alla registrerade namn, inklusive anpassade namn. DESCRIBE FUNCTION name skriver ut en enradig signatur, och DESCRIBE FUNCTION EXTENDED name lägger till användningsexempel där implementeringsklassen tillhandahåller dem.

Nästan alltid ett namn- eller omfångsproblem: strängen efter AS måste vara det fullständigt kvalificerade klassnamnet, och ADD JAR gäller bara för den session som körde den. Återanslutning tar bort både JAR-filen och eventuella temporära funktioner.

Använd GenericUDF när funktionen tar komplexa typer som arrayer, mappningar eller strukturer, ett variabelt antal argument, eller behöver validera argumenttyper själv. Den enkla UDF-klassen löser typer genom reflektion och hanterar endast primitiva skrivbara filer.

En äkta UDF måste köras på JVM:n. För andra språk, Bikupa erbjuder TRANSFORM-klausulen, som strömmar varje rad genom ett externt skript som Python över standardingång och -utgång. Den är långsammare men undviker Java helt.

De kan. evaluate() körs en gång per rad, så dyr logik multipliceras med radantalet, och objektallokering inuti metoden ökar trycket på skräpinsamlingen. Föredra en inbyggd funktion när en sådan finns, och håll evaluate() fri från I/O.

Nej. Funktionsnamn tolkas inte skiftlägeskänsligt, så ROUND(), Round() och round() är samma funktion. Java Klassnamnet i AS-klausulen är en annan sak och måste matcha den kompilerade klassen exakt, inklusive dess paket.

Maskininlärningsassistenter mappar en beskrivning i enkelt språk till kandidatsignaturer och varnar när en returtyp inte passar målkolumnen. Verifiera förslaget mot den dokumenterade signaturen, eftersom genererade namn ibland tillhör en annan SQL-dialekt.

Den producerar ett användbart skelett — klassdeklarationen, imports och en evaluate()-metod — från en kommentar som beskriver operationen. Nullhantering, skrivbara typer och paketeringssteget behöver fortfarande granskas, och funktionen måste testas på riktiga rader.

Sammanfatta detta inlägg med: