Hive-funktiot: Sisäänrakennetut ja UDF (käyttäjän määrittämät) -esimerkit

⚡ Älykäs yhteenveto

Hive-funktiot jakautuvat kahteen ryhmään: sisäänrakennetut funktiot, jotka toimitetaan moottorin ja kansikokoelman mukana, päivämäärä-, matemaattiset, ehdolliset, merkkijono- ja sekalaiset työfunktiot sekä käyttäjän määrittämät funktiot, jotka on kirjoitettu Java logiikalle, jota Hive ei toimita.

  • 📚 Kuusi sisäänrakennettua tuoteperhettä: Kokoelma-, päivämäärä-, matemaattiset, ehdolliset, merkkijono- ja sekalaiset funktiot ovat kutsuttavissa suoraan HiveQL:n sisällä.
  • 🧾 Allekirjoituksilla on väliä: Jokaisella funktiolla on kiinteä argumenttiluettelo ja dokumentoitu paluutyyppi, joten paluutyyppi määrää, missä sitä voidaan käyttää.
  • 🧩 UDF täyttää aukot: Kun sisäänrakennettua funktiota ei ole, Java org.apache.hadoop.hive.ql.exec.UDF-luokkaa laajentava luokka toimittaa puuttuvan operaation.
  • 🔢 Kolme mukautetun funktion muotoa: UDF palauttaa yhden rivin riviä kohden, UDAF kutistaa useita rivejä yhdeksi ja UDTF laajentaa yhden rivin useaksi.
  • 🛠️ Rekisteröityminen kahdessa vaiheessa: ADD JAR sijoittaa koodin luokkapolkuun ja CREATE TEMPORARY FUNCTION sitoo nimen luokkaan.
  • ♻️ Uudelleenkäyttö on se pointti: Yksi testattu UDF, kuten stemmer, voidaan kutsua jokaisesta kyselystä sen sijaan, että se kirjoitettaisiin uudelleen joka kerta.

Hive-funktiot: Sisäänrakennetut ja käyttäjän määrittämät funktiot

Funktiot on rakennettu tiettyyn tarkoitukseen suorittamaan matemaattisia, aritmeettisia, loogisia ja relaatiooperaatioita taulukon sarakenimien operandeille.

Sisäänrakennetut toiminnot

Nämä ovat toimintoja, jotka ovat jo saatavilla Hivessa. Ensin meidän on tarkistettava sovelluksen vaatimukset, ja sitten voimme käyttää näitä sisäänrakennettuja toimintoja sovelluksissamme. Voimme kutsua näitä toimintoja suoraan sovelluksessamme.

Syntaksi ja tyypit mainitaan seuraavassa osiossa.

Hiven sisäänrakennettujen funktioiden tyypit:

  • Kokoelmatoiminnot
  • Päivämäärätoiminnot
  • Matemaattiset funktiot
  • Ehdolliset toiminnot
  • Merkkijonofunktiot
  • Muut Toiminnot

Jokainen kuudesta funktioperheestä käsitellään alla funktioiden allekirjoituksineen ja paluutyyppeineen.

Kokoelmatoiminnot

Näitä funktioita käytetään kokoelmille. Kokoelmilla tarkoitetaan ryhmääping elementtejä, ja ne palauttavat yhden elementin tai elementtitaulukon funktion nimessä mainitusta paluutyypistä riippuen.

Palautustyyppi Toiminnon nimi Tuotetiedot
INT koko (kartta ) Se hakee ja antaa karttatyypin komponenttien lukumäärän
INT koko (Array ) Se hakee ja antaa taulukon alkioiden lukumäärän tyypin
Array map_keys(Kartta ) Se hakee ja antaa taulukon, joka sisältää syötekartan avaimet. Taulukko on järjestämätön.
Array map_values(Kartta ) Se hakee ja antaa taulukon, joka sisältää syötekartan arvot. Taulukko on järjestämätön.
Taulukko sort_array(Tauluko ) Lajittelee syötetaulukon elementtien nousevaan järjestykseen ja palauttaa sen
boolean array_contains(Taulukko , arvo) Palauttaa arvon TRUE, jos taulukko sisältää toisena argumenttina annetun arvon.

Päivämäärätoiminnot

Näitä käytetään päivämäärän käsittelyyn ja päivämäärätyyppien muuntamiseen yhdestä tyypistä toiseen:

Toiminnon nimi Palautustyyppi Tuotetiedot
unix_timestamp() bigint Me saamme virran unix aikaleima sekunteina. Arvo ei ole kiinteä koko kyselylle
to_date(merkkijono aikaleima) data Se hakee ja antaa päivämääräosan aikaleimamerkkijonosta
vuosi (merkkijonopäivämäärä) INT Se hakee ja antaa vuoden osan päivämäärästä tai aikaleimamerkkijonosta
vuosineljännes (päivämäärä/aikaleima/merkkijono) INT Se hakee ja antaa vuosineljänneksen päivämäärälle, aikaleimalle tai merkkijonolle välillä 1–4
kuukausi (merkkijonopäivämäärä) INT Se antaa kuukauden osan päivämäärästä tai aikaleimamerkkijonosta
tunti (merkkijonopäivämäärä) INT Se hakee ja antaa aikaleiman tunnin
minuutti (merkkijono päivämäärä) INT Se hakee ja antaa aikaleiman minuutin
date_sub(merkkijono aloituspäivämäärä, kokonaisluku päiviä) data Se hakee ja antaa tuloksen sub-funktiostatracmuutaman päivän kuluttua aloituspäivästä
nykyinen_päivämäärä data Se hakee ja antaa nykyisen päivämäärän kyselyn arvioinnin alussa
viimeinen_päivä(merkkijono päivämäärä) jono Se hakee ja antaa sen kuukauden viimeisen päivän, johon päivämäärä kuuluu.
trunc(merkkijonon päivämäärä, merkkijonomuoto) jono Se hakee ja antaa päivämäärän katkaistuna muodon määrittämän yksikön mukaan. Tuetut muodot: KUUKAUSI/MON/KK, VUOSI/VVVV/VV.

Matemaattiset funktiot

Näitä funktioita käytetään matemaattisiin operaatioihin. UDF-funktioiden luomisen sijaan Hivessä on joitakin sisäänrakennettuja matemaattisia funktioita.

Toiminnon nimi Palautustyyppi Tuotetiedot
pyöreä (DOUBLE X) KAKSINKERTAINEN Se hakee ja palauttaa X:n pyöristetyn BIGINT-arvon
pyöreä (DOUBLE X, INT d) KAKSINKERTAINEN Se hakee ja palauttaa X:n pyöristettynä d desimaalin tarkkuudella
pyöreä (DOUBLE X) KAKSINKERTAINEN Se hakee ja palauttaa X:n pyöristetyn BIGINT-arvon käyttämällä HALF_EVEN-pyöristystapaa, joka tunnetaan myös pankkiirin pyöristyksenä.
kerros (DOUBLE X) BIGINT Se hakee ja palauttaa suurimman BIGINT-arvon, joka on yhtä suuri tai pienempi kuin X-arvo.
katto (DOUBLE a), katto (DOUBLE a) BIGINT Se hakee ja palauttaa pienimmän BIGINT-arvon, joka on yhtä suuri tai suurempi kuin a-arvo
rand(), rand(INT siemen) KAKSINKERTAINEN Se hakee ja palauttaa satunnaisluvun, joka on jakautunut tasaisesti välillä 0-1. Siemenen syöttäminen tekee sekvenssistä toistettavan.

Ehdolliset toiminnot

Näitä funktioita käytetään ehdollisten arvojen tarkistuksiin.

Toiminnon nimi Palautustyyppi Tuotetiedot
if(Boolen testiehto, T-arvoTrue, T-arvoFalseOrNull) T Se antaa arvonTosi, kun testiehto on tosi, ja muussa tapauksessa arvonEpätosiTaiNull.
isnull(X) boolean Se noutaa ja antaa arvon true, jos X on NULL, ja muussa tapauksessa false.
isnotnull(X) boolean Se noutaa ja antaa arvon true, jos X ei ole NULL, ja muussa tapauksessa false.
nvl(T-arvo, T-oletusarvo) T Se antaa oletusarvon, kun arvo on NULL, ja arvon muussa tapauksessa.

Merkkijonofunktiot

Merkkijonojen manipulointia ja merkkijonooperaatioita käsittelevät seuraavat funktiot.

Toiminnon nimi Palautustyyppi Tuotetiedot
käänteinen(merkkijono X) jono Se antaa X:n käänteisen merkkijonon
rpad (merkkijono str, int pituus, merkkijono tyyny) jono Se hakee ja antaa oikealle täytetyn merkkijonon, jonka kokonaispituus on pituus.
rtrim(merkkijono X) jono Se noutaa ja palauttaa merkkijonon, joka syntyy leikkaamalla välilyöntejä X:n lopusta (oikealta puolelta).
Esimerkiksi, rtrim(' tulokset ') johtaa tulokseen
välilyönti (INT n) jono Se hakee ja antaa merkkijonon, jossa on n välilyöntiä.
split(STRING str, STRING pat) ryhmä Jakaa str:n pat ympärille (pat on säännöllinen lauseke).
str_to_map(teksti[, erotin1, erotin2]) kartta Se jakaa tekstin avain-arvo-pareihin käyttämällä kahta erotinta. Erotin1 erottaa parit ja erotin2 jakaa jokaisen parin.

Muut Toiminnot

Useat sisäänrakennetut funktiot eivät kuulu mihinkään yllä mainituista funktioperheistä. Nämä kattavat hajauttamisen, istuntotiedot ja mielivaltaisten kutsujen käytön. Java menetelmiä.

Toiminnon nimi Palautustyyppi Tuotetiedot
tiiviste(a1[, a2…]) INT Palauttaa argumenttien hajautusarvon
nykyinen_käyttäjä() jono Palauttaa nykyisen käyttäjätunnuksen määritetystä todennustyökalun hallinnasta
nykyinen_tietokanta() jono Palauttaa nykyisen tietokannan nimen
md5(merkkijono/binääri) jono Palauttaa MD5:n 128-bittisen tarkistussumman 32 heksadesimaalinumeron merkkijonona tai NULL-arvona NULL-argumentin tapauksessa.
sha1(merkkijono/binääri) jono Palauttaa argumentin SHA-1-tiivisteen heksamerkkijonona
crc32(merkkijono/binääri) bigint Palauttaa merkkijonon tai binääriargumentin syklisen redundanssitarkistuksen arvon.
versio() jono Palauttaa Hive-version koontiversionumerona, jota seuraa koontiversion tiiviste.
heijastaa(luokka, metodi[, arg1…]) vaihtelee Puhelut a Java metodin argumentin allekirjoituksen vertailun avulla käyttäen heijastusta. java_method() on synonyymi

UDF:t (käyttäjän määrittämät funktiot)

Hivessä käyttäjät voivat määrittää omia funktioitaan tiettyjen asiakasvaatimusten täyttämiseksi. Näitä kutsutaan Hivessä UDF-funktioiksi. Käyttäjän määrittämät funktiot kirjoitetaan Java tietyille moduuleille.

Jotkin UDF-funktiot on suunniteltu erityisesti koodin uudelleenkäytettävyyttä varten sovelluskehyksissä. Kehittäjä kirjoittaa nämä funktiot Java ja integroi nuo UDF:t Hiveen.

Kyselyn suorituksen aikana kehittäjä voi käyttää koodia suoraan, ja UDF:t palauttavat tuloksia käyttäjän määrittämien tehtävien mukaisesti. Se tarjoaa korkean suorituskyvyn koodauksen ja suorituksen suhteen.

Esimerkiksi merkkijonojen stemmausta varten meillä ei ole Hivessä valmiiksi määriteltyä funktiota. Tätä varten voimme kirjoittaa stem UDF:n JavaAina kun tarvitsemme varren toiminnallisuutta, voimme kutsua tätä varren UDF:ää suoraan Hivessä.

Tässä vartalon toiminnallisuus tarkoittaa sanojen johtamista niiden juurisanoista. Vartalonmuodostusalgoritmi supistaa sanat ”wishing”, ”wished” ja ”wishes” juurisanaksi ”wish”. Tämän tyyppisen toiminnallisuuden suorittamiseksi voimme kirjoittaa UDF-funktion Java ja integroi se Hive.

Käyttötapauksesta riippuen UDF voidaan kirjoittaa hyväksymään ja tuottamaan eri määriä syöte- ja lähtöarvoja.

Yleinen UDF-tyyppi hyväksyy yhden syötearvon ja tuottaa yhden tulosarvon. Jos UDF-funktiota käytetään kyselyssä, sitä kutsutaan kerran jokaista tulosdatajoukon riviä kohden.

Toiseen suuntaan funktio voi hyväksyä syötteeksi joukon arvoja ja palauttaa myös yhden tulosarvon. Tämä ero erottaa toisistaan ​​seuraavaksi kuvatut kolme mukautettua funktiotyyppiä.

UDF vs. UDAF vs. UDTF Hivessä

Hiven mukautetut funktiot on ryhmitelty sen mukaan, kuinka monta riviä tulee sisään ja kuinka monta tulee ulos. Väärän tyypin valitseminen on yleisin syy siihen, miksi mukautettu funktio kieltäytyy kääntymästä tai palauttaa yhden rivin taulukon sijaan.

Tyyppi Rivit sisään → rivit ulos Luokka laajennettavaksi Sisäänrakennetut esimerkit
UDF Yksi rivi → yksi rivi org.apache.hadoop.hive.ql.exec.UDF pituus(), pyöreä(), käänteinen()
UDAF Monta riviä → yksi rivi org.apache.hadoop.hive.ql.udf.generic.AbstractYleinen UDAF-ratkaisija määrä(), min(), max()
UDTF Yksi rivi → monta riviä org.apache.hadoop.hive.ql.udf.generic.GenericUDTF explode(), json_tuple(), parse_url_tuple()

Taulukosta seuraa kaksi käytännön sääntöä:

  • UDAF yhdistetään lähes aina GROUP BY -lausekkeeseen, koska se kutistaa jokaisen ryhmän yhdelle riville.
  • UDTF-saraketta ei voi valita muiden saman SELECT-listan sarakkeiden rinnalla, joten sitä käytetään yleensä LATERAL VIEW:n kanssa.

Rivitason työskentelyyn on myös toinen, tehokkaampi perusluokka, GenericUDF, joka hyväksyy monimutkaisia ​​tyyppejä, kuten taulukoita, map-tyyppejä ja rakenteita, sekä vaihtelevan määrän argumentteja.

UDF-tiedoston kirjoittaminen ja rekisteröiminen Hiveen

Yllä kuvattu esimerkki varresta voidaan rakentaa reaalilukufunktioksi neljässä vaiheessa. Mikään muu kuin Java kääntäjä ja käynnissä oleva Hive-istunto vaaditaan.

Vaihe 1) Kirjoittaa Java luokka, joka laajentaa UDF:ää ja toteuttaa julkisen evaluate()-metodin. Hive kutsuu evaluate()-metodia kerran riviä kohden, joten metodin on käsiteltävä NULL-syöte.

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

Vaihe 2) Käännä luokka ja pakkaa se JAR-tiedostoon, esimerkiksi hive-udf-1.0.jar, yhdessä kaikkien sen luokkien kanssa, joista se on riippuvainen.

Vaihe 3) Lisää JAR-tiedosto Hive-luokkapolkuun ja sido funktion nimi luokkaan. Väliaikainen funktio on voimassa vain nykyisen istunnon ajan.

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

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

Vaihe 4) Kutsu uutta funktiota täsmälleen kuten sisäänrakennettua funktiota. Sovellettuna sanoihin ”wishing”, ”wished” ja ”wishes”, tämä luokka palauttaa ”wish” kaikille kolmelle.

SELECT word, stem(word) FROM words;

Jotta funktio pysyisi käytettävissä jokaiselle istunnolle ja jokaiselle käyttäjälle, rekisteröi se pysyvästi tietokantaan. JAR-tiedoston on sijaittava polulla, jota koko klusteri voi lukea, mikä yleensä tarkoittaa HDFS:ää.

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

Yksi luokka voi määrittää useamman kuin yhden evaluate()-metodin. Hive vertaa kutsua argumenttien allekirjoituksiin, joten yksi funktio voi hyväksyä sekä merkkijonon että kokonaisluvun.

UKK

SHOW FUNCTIONS listaa kaikki rekisteröidyt nimet, mukaan lukien mukautetut nimet. DESCRIBE FUNCTION nimi tulostaa yksirivisen allekirjoituksen ja DESCRIBE FUNCTION EXTENDED nimi lisää käyttöesimerkkejä, jos toteuttava luokka ne toimittaa.

Lähes aina nimi- tai laajuusongelma: AS:n jälkeisen merkkijonon on oltava täysin pätevä luokan nimi, ja ADD JAR koskee vain sitä istuntoa, jossa se suoritettiin. Yhdistäminen uudelleen poistaa sekä JAR-tiedoston että mahdolliset väliaikaiset funktiot.

Käytä GenericUDF-luokkaa, kun funktio ottaa vastaan ​​monimutkaisia ​​tyyppejä, kuten taulukoita, karttoja tai rakenteita, muuttuvan määrän argumentteja tai kun sen on itse validoitava argumenttityypit. Yksinkertainen UDF-luokka ratkaisee tyypit peilaamalla ja käsittelee vain alkeellisia kirjoitettavia objekteja.

Aidon UDF:n on toimittava JVM:ssä. Muilla kielillä Hive tarjoaa TRANSFORM-lauseen, joka suoratoistaa jokaisen rivin ulkoisen komentosarjan, kuten Python standardin syötteen ja tulosteen yli. Se on hitaampi, mutta välttää Java täysin.

Ne voivat. evaluate() suoritetaan kerran riviä kohden, joten kallis logiikka kerrotaan rivien määrällä ja objektien allokointi metodin sisällä lisää roskienkeruupainetta. Suosi sisäänrakennettua funktiota, jos sellainen on olemassa, ja pidä evaluate() vapaana I/O:sta.

Ei. Funktioiden nimet ratkaisevat kirjainkoon riippumatta, joten ROUND(), Round() ja round() ovat sama funktio. Java AS-lausekkeen luokan nimi on eri asia, ja sen on vastattava täsmälleen käännettyä luokkaa, mukaan lukien sen paketti.

Koneoppimisen avustajat yhdistävät selkokielisen kuvauksen ehdokkaiden allekirjoituksiin ja varoittavat, kun paluutyyppi ei sovi kohdesarakkeeseen. Tarkista ehdotus dokumentoitua allekirjoitusta vasten, koska luodut nimet kuuluvat joskus toiseen SQL-murteeseen.

Se tuottaa käyttökelpoisen rungon – luokan määrittelyn, tuonnit ja evaluate()-metodin – operaatiota kuvaavasta kommentista. Null-arvojen käsittely, kirjoitettavat tyypit ja pakkausvaihe vaativat vielä tarkastelua, ja funktio on testattava oikeilla riveillä.

Tiivistä tämä viesti seuraavasti: