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.

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.
