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.

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.
