Hive-functies: voorbeeld van ingebouwde en door de gebruiker gedefinieerde functies (UDF).

โšก Slimme samenvatting

Hive-functies vallen in twee groepen uiteen: ingebouwde functies die met de engine worden meegeleverd en betrekking hebben op verzamelingen, datums, wiskundige bewerkingen, voorwaarden, tekenreeksen en diverse andere taken, en door de gebruiker gedefinieerde functies die in Hive zijn geschreven. Java Voor logica biedt Hive geen ondersteuning.

  • ๐Ÿ“š Zes ingebouwde gezinnen: Collectie-, datum-, wiskundige, voorwaardelijke, tekenreeks- en diverse andere functies kunnen rechtstreeks vanuit HiveQL worden aangeroepen.
  • ๐Ÿงพ Handtekeningen zijn belangrijk: Elke functie heeft een vaste lijst met argumenten en een gedocumenteerd retourtype, dus het retourtype bepaalt waar de functie gebruikt kan worden.
  • ๐Ÿงฉ UDF vult de hiaten op: Wanneer er geen ingebouwde functie bestaat, een Java De klasse die org.apache.hadoop.hive.ql.exec.UDF uitbreidt, levert de ontbrekende bewerking.
  • ๐Ÿ”ข Drie vormen van maatwerkfunctionaliteit: UDF retourneert รฉรฉn rij per rij, UDAF voegt meerdere rijen samen tot รฉรฉn, en UDTF vouwt รฉรฉn rij uit tot meerdere.
  • ๏ธ Registratie in twee stappen: Met ADD JAR wordt de code aan het classpath toegevoegd en met CREATE TEMPORARY FUNCTION wordt een naam aan de klasse gekoppeld.
  • โ™ป๏ธ Het gaat om hergebruik: Een geteste UDF, zoals een stemmer, kan vanuit elke query worden aangeroepen in plaats van dat deze telkens opnieuw moet worden geschreven.

Hive-functies: ingebouwde en door de gebruiker gedefinieerde functies

Functies worden ontwikkeld voor een specifiek doel, namelijk het uitvoeren van bewerkingen zoals wiskundige, rekenkundige, logische en relationele bewerkingen op de operanden van tabelkolomnamen.

Ingebouwde functies

Dit zijn functies die al beschikbaar zijn in Hive. Eerst moeten we de applicatievereisten controleren, en dan kunnen we deze ingebouwde functies in onze applicaties gebruiken. We kunnen deze functies rechtstreeks in onze applicatie oproepen.

De syntaxis en typen worden in de volgende sectie besproken.

Soorten ingebouwde functies in Hive:

  • Verzamelfuncties
  • Datum Functies
  • Wiskundige functies
  • Voorwaardelijke functies
  • String-functies
  • Diversen Functies

Elk van de zes families wordt hieronder beschreven, inclusief de functiesignaturen en retourtypen.

Verzamelfuncties

Deze functies worden gebruikt voor collecties. Collecties betekenen de groepping Ze retourneren elementen, en afhankelijk van het retourtype dat in de functienaam wordt vermeld, retourneren ze een enkel element of een array van elementen.

Retourtype Functie Naam Beschrijving
INT maat (kaart ) Het zal het aantal componenten in het kaarttype ophalen en weergeven.
INT maat (matrix ) Het zal het aantal elementen in het arraytype ophalen en weergeven.
Array kaart_sleutels(Kaart) ) Het programma haalt de sleutels van de invoermap op en geeft deze terug als een array. De array is niet geordend.
Array kaart_waarden(Kaart) ) Het programma haalt de waarden uit de invoermap op en geeft een array terug met de waarden van de invoermap. De array is niet geordend.
Array sort_array(Array ) Sorteert de invoerarray in oplopende volgorde van de elementen en retourneert deze.
Boolean array_contains(Array , waarde) Retourneert TRUE als de array de waarde bevat die als tweede argument is doorgegeven.

Datum Functies

Deze worden gebruikt voor het manipuleren van datums en het converteren van datumtypen van het ene type naar het andere:

Functie Naam Retourtype Beschrijving
unix_timestamp() bigint We zullen de huidige gegevens verkrijgen. Unix Tijdstempel in seconden. De waarde is niet vast voor de hele query.
tot_datum(string timestamp) gegevens Het programma haalt het datumgedeelte van een tijdstempelreeks op en geeft dit weer.
jaar(tekenreeksdatum) INT Het haalt het jaargedeelte van een datum of een tijdstempelreeks op en geeft het weer
kwartaal(datum/tijdstempel/tekenreeks) INT Het haalt het kwartaal van het jaar op en geeft het weer voor een datum, tijdstempel of tekenreeks in het bereik 1 tot 4
maand(tekenreeksdatum) INT Het geeft het maandgedeelte van een datum of een tijdstempelreeks
uur(tekenreeksdatum) INT Het programma haalt het uur van de tijdstempel op en geeft dit weer.
minuut(tekenreeksdatum) INT Het programma haalt de minuten van de tijdstempel op en geeft deze weer.
datum_aftrekken(string startdatum, int dagen) gegevens Het zal het resultaat van de sub ophalen en weergeven.traceen aantal dagen vanaf de startdatum
huidige_datum gegevens Het zal de huidige datum ophalen en weergeven aan het begin van de query-evaluatie.
laatste_dag(string datum) snaar Het programma haalt de laatste dag van de maand op waartoe de datum behoort en geeft deze weer.
trunc(tekenreeksdatum, tekenreeksformaat) snaar Het programma haalt de datum op en geeft deze weer, afgekapt tot de eenheid die is gespecificeerd in het formaat. Ondersteunde formaten: MAAND/MAAND/MM, JAAR/JJJJ/JJ.

Wiskundige functies

Deze functies worden gebruikt voor wiskundige bewerkingen. In plaats van UDF's te creรซren, beschikken we in Hive over een aantal ingebouwde wiskundige functies.

Functie Naam Retourtype Beschrijving
rond(DUBBEL X) DUBBELE Het programma haalt de afgeronde BIGINT-waarde van X op en retourneert deze.
rond(DUBBEL X, INT d) DUBBELE Het programma haalt de gegevens op en retourneert X afgerond op d decimalen.
brood(DUBBEL X) DUBBELE Het programma haalt de afgeronde BIGINT-waarde van X op en retourneert deze met behulp van de HALF_EVEN-afrondingsmodus, ook wel bekend als bankiersafronding.
vloer (DUBBEL X) BIGINT Het programma haalt de maximale BIGINT-waarde op die gelijk is aan of kleiner is dan de X-waarde en retourneert deze.
plafond(DUBBEL a), plafond(DUBBEL a) BIGINT Het zal de minimale BIGINT-waarde ophalen en retourneren die gelijk is aan of groter is dan de waarde a.
rand(), rand(INT-zaad) DUBBELE Het programma haalt een willekeurig getal op en retourneert een getal dat gelijkmatig verdeeld is tussen 0 en 1. Door een seed op te geven, wordt de reeks herhaalbaar.

Voorwaardelijke functies

Deze functies worden gebruikt voor voorwaardelijke waardecontroles.

Functie Naam Retourtype Beschrijving
if(Booleaanse testConditie, T-waardeWaar, T-waardeFalseOrNull) T Het geeft de waarde True terug als de testconditie waar is, en anders False of Null.
isnull(X) Boolean Het zal de waarde ophalen en 'true' retourneren als X NULL is, en 'false' anders.
isnotnull(X) Boolean Het zal de waarde ophalen en 'true' retourneren als X niet NULL is, en 'false' anders.
nvl(T waarde, T standaardwaarde) T Het geeft de standaardwaarde terug als de waarde NULL is, en de waarde anders.

String-functies

Tekstmanipulaties en tekstbewerkingen worden afgehandeld door de volgende functies.

Functie Naam Retourtype Beschrijving
omkeren(string X) snaar Het geeft de omgekeerde reeks X
rpad(string str, int lengte, string pad) snaar Het zal een string ophalen en rechts opgevuld met een pad tot een totale lengte van ...
rtrim(string X) snaar Het programma haalt de tekenreeks op die ontstaat door de spaties aan het einde (rechterkant) van X te verwijderen en geeft deze terug.
Bij voorbeeld, rtrim('resultaten') resulteert in 'resultaten'
spatie(INT n) snaar Het zal een tekenreeks van n spaties ophalen en retourneren.
split(STRING str, STRING pat) reeks Splitst str rond pat (pat is een reguliere expressie).
str_to_map(text[, delimiter1, delimiter2]) kaart Het programma splitst tekst in sleutel-waardeparen met behulp van twee scheidingstekens. Scheidingsteken 1 scheidt de paren en scheidingsteken 2 splitst elk paar.

Diversen Functies

Verschillende ingebouwde functies behoren tot geen van de bovenstaande categorieรซn. Deze omvatten hashing, sessie-informatie en het aanroepen van willekeurige functies. Java werkwijzen.

Functie Naam Retourtype Beschrijving
hash(a1[, a2โ€ฆ]) INT Retourneert een hashwaarde van de argumenten.
huidige_gebruiker() snaar Retourneert de huidige gebruikersnaam van de geconfigureerde authenticatiemanager.
huidige_database() snaar Geeft de naam van de huidige database terug.
md5 (string/binair) snaar Retourneert de MD5 128-bits checksum als een tekenreeks van 32 hexadecimale cijfers, of NULL voor een NULL-argument.
sha1(string/binair) snaar Retourneert de SHA-1-hash van het argument als een hexadecimale tekenreeks.
crc32(string/binair) bigint Retourneert de waarde van de cyclische redundantiecontrole van een tekenreeks- of binair argument.
versie() snaar Geeft de Hive-versie terug als een buildnummer gevolgd door een build-hash.
reflect(klasse, methode[, arg1โ€ฆ]) varieert Belt een Java methode door de argumenthandtekening te vergelijken met behulp van reflectie. java_method() is een synoniem

UDF's (door de gebruiker gedefinieerde functies)

In Hive kunnen gebruikers hun eigen functies definiรซren om aan specifieke klantvereisten te voldoen. Deze functies worden in Hive UDF's genoemd. Gebruikersgedefinieerde functies worden geschreven in... Java voor specifieke modules.

Sommige UDF's zijn specifiek ontworpen voor hergebruik van code in applicatie-frameworks. De ontwikkelaar schrijft deze functies in Java en integreert die UDF's met Hive.

Tijdens de uitvoering van een query kan de ontwikkelaar de code direct gebruiken, en de UDF's (User Defined Functions) retourneren uitvoer op basis van de door de gebruiker gedefinieerde taken. Dit zorgt voor hoge prestaties op het gebied van programmeren en uitvoering.

Voor het stammen van strings hebben we bijvoorbeeld geen vooraf gedefinieerde functie in Hive. Hiervoor kunnen we een UDF (User Defined Function) schrijven. JavaOveral waar we stamfunctionaliteit nodig hebben, kunnen we deze stam-UDF rechtstreeks in Hive aanroepen.

Hier betekent stamfunctionaliteit het afleiden van woorden uit hun stamwoorden. Een stamalgoritme reduceert de woorden "wishing", "wished" en "wishes" tot het stamwoord "wish". Om dit soort functionaliteit uit te voeren, kunnen we een UDF schrijven in... Java en ermee integreren Bijenkorf.

Afhankelijk van het gebruiksscenario kan de UDF zo worden geschreven dat deze verschillende aantallen invoer- en uitvoerwaarden accepteert en produceert.

Een UDF (User Defined Function) accepteert doorgaans รฉรฉn invoerwaarde en produceert รฉรฉn uitvoerwaarde. Als de UDF in een query wordt gebruikt, wordt deze รฉรฉn keer aangeroepen voor elke rij in de resultaatset.

Omgekeerd kan een functie ook een groep waarden als invoer accepteren en รฉรฉn enkele uitvoerwaarde retourneren. Dat verschil is wat de drie hierna beschreven typen aangepaste functies van elkaar onderscheidt.

UDF versus UDAF versus UDTF in Hive

Aangepaste functies in Hive worden gegroepeerd op basis van het aantal rijen dat erin gaat en het aantal rijen dat eruit komt. Het kiezen van het verkeerde type is de meest voorkomende reden waarom een โ€‹โ€‹aangepaste functie niet compileert of slechts รฉรฉn rij retourneert waar een tabel werd verwacht.

Type Rijen erin โ†’ rijen eruit Les om te verlengen Ingebouwde voorbeelden
UDF Eรฉn rij โ†’ รฉรฉn rij org.apache.hadoop.hive.ql.exec.UDF lengte(), afronden(), omkeren()
UDAF Veel rijen โ†’ รฉรฉn rij org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver count(), min(), max()
UDTF Eรฉn rij โ†’ veel rijen org.apache.hadoop.hive.ql.udf.generic.GenericUDTF explode(), json_tuple(), parse_url_tuple()

Uit de tabel volgen twee praktische regels:

  • Een UDAF wordt bijna altijd gecombineerd met een GROUP BY-clausule, omdat deze elke groep reduceert tot รฉรฉn rij.
  • Een UDTF kan niet samen met andere kolommen in dezelfde SELECT-lijst worden geselecteerd, dus wordt deze normaal gesproken gebruikt met een LATERAL VIEW.

Er is ook een tweede, krachtigere basisklasse voor werk op rijniveau, GenericUDF, die complexe typen zoals arrays, maps en structs accepteert, evenals een variabel aantal argumenten.

Hoe schrijf en registreer je een UDF in Hive?

Het hierboven beschreven voorbeeld van een stam kan in vier stappen als een echte functie worden opgebouwd. Niets meer dan een Java Een compiler en een actieve Hive-sessie zijn vereist.

Stap 1) Schrijf een Java Een klasse die UDF uitbreidt en een openbare evaluate()-methode implementeert. Hive roept evaluate() รฉรฉn keer per rij aan, dus de methode moet een NULL-invoer kunnen verwerken.

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);
    }
}

Stap 2) Compileer de klasse en verpak deze in een JAR-bestand, bijvoorbeeld hive-udf-1.0.jar, samen met alle klassen waarvan deze afhankelijk is.

Stap 3) Plaats het JAR-bestand in het Hive-classpath en koppel een functienaam aan de klasse. Een tijdelijke functie bestaat alleen gedurende de huidige sessie.

ADD JAR /home/hduser/hive-udf-1.0.jar;

CREATE TEMPORARY FUNCTION stem AS 'com.guru99.hive.udf.Stem';

Stap 4) Roep de nieuwe functie aan zoals een ingebouwde functie. Toegepast op de woorden "wishing", "wished" en "wishes", retourneert deze klasse "wish" voor alle drie.

SELECT word, stem(word) FROM words;

Om de functie beschikbaar te houden voor elke sessie en elke gebruiker, registreert u deze permanent in een database. Het JAR-bestand moet zich bevinden op een pad dat door het hele cluster kan worden gelezen, wat normaal gesproken HDFS is.

CREATE FUNCTION default.stem AS 'com.guru99.hive.udf.Stem'
USING JAR '/user/hive/udfs/hive-udf-1.0.jar';

Een enkele klasse kan meer dan รฉรฉn evaluate()-methode declareren. Hive vergelijkt de aanroep met de argumenthandtekeningen, waardoor een functie zowel een tekenreeks als een geheel getal kan accepteren.

Veelgestelde vragen

SHOW FUNCTIONS geeft een lijst van alle geregistreerde namen, inclusief aangepaste namen. DESCRIBE FUNCTION name print een handtekening van รฉรฉn regel, en DESCRIBE FUNCTION EXTENDED name voegt gebruiksvoorbeelden toe waar de implementerende klasse deze levert.

Vrijwel altijd een probleem met de naam of het bereik: de tekenreeks na AS moet de volledig gekwalificeerde klassenaam zijn, en ADD JAR is alleen van toepassing op de sessie waarin het is uitgevoerd. Bij het opnieuw verbinden worden zowel het JAR-bestand als eventuele tijdelijke functies verwijderd.

Gebruik GenericUDF wanneer de functie complexe gegevenstypen zoals arrays, maps of structs accepteert, een variabel aantal argumenten heeft of zelf argumenttypen moet valideren. De eenvoudige UDF-klasse lost typen op via reflectie en verwerkt alleen primitieve Writable-typen.

Een echte UDF moet op de JVM draaien. Voor andere talen geldt het volgende: Bijenkorf biedt de TRANSFORM-clausule aan, die elke rij door een extern script zoals Python via standaard invoer en uitvoer. Het is trager, maar voorkomt... Java geheel.

Dat kan. `evaluate()` wordt รฉรฉn keer per rij uitgevoerd, waardoor kostbare logica vermenigvuldigd wordt met het aantal rijen, en objecttoewijzing binnen de methode zorgt voor extra belasting van de garbage collector. Gebruik bij voorkeur een ingebouwde functie als die beschikbaar is, en houd `evaluate()` vrij van I/O.

Nee. Functienamen worden hoofdletterongevoelig opgelost, dus ROUND(), Round() en round() zijn dezelfde functie. Java De klassenaam in de AS-clausule is een andere zaak en moet exact overeenkomen met de gecompileerde klasse, inclusief het pakket.

Machine learning-assistenten koppelen een beschrijving in gewone taal aan mogelijke handtekeningen en waarschuwen wanneer een retourtype niet overeenkomt met de doelkolom. Controleer de suggestie aan de hand van de gedocumenteerde handtekening, omdat gegenereerde namen soms tot een ander SQL-dialect behoren.

Het genereert een bruikbaar skelet โ€“ de klassedeclaratie, imports en een evaluate()-methode โ€“ op basis van een commentaar dat de bewerking beschrijft. De afhandeling van null-waarden, beschrijfbare typen en de verpakkingsstap moeten nog worden herzien, en de functie moet worden getest op echte rijen.

Vat dit bericht samen met: