Taru funktsioonid: sisseehitatud ja UDF (kasutaja määratletud) näide

⚡ Nutikas kokkuvõte

Taru funktsioonid jagunevad kahte rühma: sisseehitatud funktsioonid, mis on mootoriga kaasas ja hõlmavad kogu, kuupäeva-, matemaatilised, tingimuslikud, stringi- ja muud tööfunktsioonid ning kasutaja määratletud funktsioonid, mis on kirjutatud keeles. Java loogika jaoks, mida Hive ei paku.

  • 📚 Kuus sisseehitatud perekonda: Kogumis-, kuupäeva-, matemaatilisi, tingimuslikke, string- ja muid funktsioone saab otse HiveQL-is kutsuda.
  • 🧾 Allkirjad on olulised: Igal funktsioonil on fikseeritud argumentide loend ja dokumenteeritud tagastustüüp, seega määrab tagastustüüp, kus seda kasutada saab.
  • 🧩 UDF täidab lüngad: Kui sisseehitatud funktsiooni pole olemas, siis a Java Klass, mis laiendab org.apache.hadoop.hive.ql.exec.UDF-i, varustab puuduva operatsiooniga.
  • 🔢 Kolm kohandatud funktsiooni kuju: UDF tagastab ühe rea rea ​​kohta, UDAF koondab mitu rida üheks ja UDTF laiendab ühe rea mitmeks.
  • 🛠️ Registreerimine kahes etapis: ADD JAR paneb koodi klassiteele ja CREATE TEMPORARY FUNCTION seob klassiga nime.
  • ♻️ Asi on taaskasutamises: Igast päringust saab kutsuda ühte testitud UDF-i, näiteks tüvefunktsiooni (stemmer), selle asemel, et seda iga kord ümber kirjutada.

Taru funktsioonid: sisseehitatud ja kasutaja määratletud funktsioonid

Funktsioonid on loodud kindlal eesmärgil, et sooritada tabeli veerunimede operandidega selliseid toiminguid nagu matemaatilised, aritmeetilised, loogilised ja relatsioonilised toimingud.

Sisseehitatud funktsioonid

Need on funktsioonid, mis on Tarus juba saadaval. Esiteks peame kontrollima rakenduse nõuet ja seejärel saame neid sisseehitatud funktsioone oma rakendustes kasutada. Saame neid funktsioone otse meie rakenduses kutsuda.

Süntaksit ja tüüpe mainitakse järgmises jaotises.

Hive'i sisseehitatud funktsioonide tüübid:

  • Kogumisfunktsioonid
  • Kuupäeva funktsioonid
  • Matemaatilised funktsioonid
  • Tingimuslikud funktsioonid
  • Stringi funktsioonid
  • Muu Funktsioonid

Kõiki kuut funktsiooniperekonda käsitletakse allpool koos nende funktsioonide signatuuride ja tagastustüüpidega.

Kogumisfunktsioonid

Neid funktsioone kasutatakse kollektsioonide jaoks. Kollektsioonid tähendavad gruppiping elementidest ja nad tagastavad ühe elemendi või elementide massiivi, olenevalt funktsiooni nimes mainitud tagastustüübist.

Tagastuse tüüp Funktsiooni nimi Kirjeldus
INT suurus (kaart ) See hangib ja annab kaarditüübi komponentide arvu.
INT suurus (massiiv ) See hangib ja annab massiivi tüübi elementide arvu
Massiiv map_keys(Kaart ) See hangib ja annab sisendkaardi võtmeid sisaldava massiivi. Massiiv on järjestamata.
Massiiv map_values(Kaart ) See hangib ja annab sisendkaardi väärtusi sisaldava massiivi. Massiiv on järjestamata.
Massiiv sort_array(Massiiv ) Sorteerib sisendmassiivi elementide kasvavas järjekorras ja tagastab tulemuse.
Boolean array_contains(Massiiv , väärtus) Tagastab väärtuse TRUE, kui massiiv sisaldab teise argumendina edastatud väärtust.

Kuupäeva funktsioonid

Neid kasutatakse kuupäevadega manipuleerimiseks ja kuupäevatüüpide teisendamiseks ühest tüübist teise:

Funktsiooni nimi Tagastuse tüüp Kirjeldus
unix_timestamp() BigInt Me saame praeguse Unix ajatempel sekundites. Väärtus ei ole kogu päringu jaoks fikseeritud.
to_date(string ajatempel) andmed See hangib ja annab ajatempli stringi kuupäevaosa.
aasta (stringi kuupäev) INT See toob ja annab aasta osa kuupäevast või ajatempli stringist
veerand (kuupäev/ajatempel/string) INT See hangib ja annab aasta kvartali kuupäeva, ajatempli või stringi jaoks vahemikus 1 kuni 4
kuu (stringi kuupäev) INT See annab kuu osa kuupäevast või ajatempli stringist
tund (stringi kuupäev) INT See hangib ja annab ajatempli tunni.
minut (stringi kuupäev) INT See hangib ja annab ajatempli minuti.
date_sub(string alguskuupäev, int päevad) andmed See hangib ja annab sub-tulemusetracmitu päeva alates alguskuupäevast
praegune_kuupäev andmed See hangib ja annab päringu hindamise alguses praeguse kuupäeva.
viimane_päev(stringi kuupäev) nöör See hangib ja annab kuu viimase päeva, kuhu kuupäev kuulub.
trunc (stringi kuupäev, stringi vorming) nöör See hangib ja annab kuupäeva, mis on kärbitud vormingus määratud ühikuni. Toetatud vormingud: KUU/ES/KK, AASTA/AAAA/AA.

Matemaatilised funktsioonid

Neid funktsioone kasutatakse matemaatilisteks toiminguteks. UDF-ide loomise asemel on Hive'is mõned sisseehitatud matemaatilised funktsioonid.

Funktsiooni nimi Tagastuse tüüp Kirjeldus
ümmargune (DOUBLE X) DOUBLE See hangib ja tagastab X-i ümardatud BIGINT-väärtuse.
ümmargune (DOUBLE X, INT d) DOUBLE See hangib ja tagastab X ümardatuna d kümnendkoha täpsusega
ümmargune (DOUBLE X) DOUBLE See hangib ja tagastab X ümardatud BIGINT väärtuse, kasutades HALF_EVEN ümardusrežiimi, mida tuntakse ka pankurite ümardamise nime all.
korrus (DOUBLE X) SUUR See hangib ja tagastab maksimaalse BIGINT-väärtuse, mis on võrdne või väiksem kui X-väärtus.
lagi (DOUBLE a), lagi (DOUBLE a) SUUR See hangib ja tagastab minimaalse BIGINT-väärtuse, mis on võrdne või suurem kui a-väärtus
rand(), rand(INT seeme) DOUBLE See hangib ja tagastab juhusliku arvu, mis on ühtlaselt jaotatud vahemikus 0 kuni 1. Seemne sisestamine muudab jada korratavaks.

Tingimuslikud funktsioonid

Neid funktsioone kasutatakse tingimuslike väärtuste kontrollimiseks.

Funktsiooni nimi Tagastuse tüüp Kirjeldus
if(Tõve testtingimus, T väärtusTrue, T väärtusFalseOrNull) T See annab väärtuseks „valueTrue”, kui testCondition on tõene, ja muul juhul väärtuseks „valueFalseOrNull”.
isnull(X) Boolean See hangib väärtuse ja annab tõese väärtuse, kui X on NULL, ja muul juhul väärtuse väär.
isnotnull(X) Boolean See hangib väärtuse ja annab tõese väärtuse, kui X ei ole NULL, ja muul juhul väärtuse väär.
nvl(T väärtus, T vaikeväärtus) T See annab vaikeväärtuse (default_value), kui väärtus on NULL, ja väärtuse (value) muul juhul.

Stringi funktsioonid

Stringimanipulatsioone ja stringioperatsioone käsitlevad järgmised funktsioonid.

Funktsiooni nimi Tagastuse tüüp Kirjeldus
vastupidine(string X) nöör See annab X-i vastupidise stringi
rpad (string str, int pikkus, string pad) nöör See hangib ja annab str-i paremale polsterdatud pad-iga kogupikkusega length
rtrim(string X) nöör See hangib ja tagastab stringi, mis tuleneb tühikute kärpimisest X-i lõpust (paremalt poolt).
Näiteks, rtrim(' results ') annab tulemuseks 'tulemused'
tühik (INT n) nöör See hangib ja annab n tühikuga stringi.
poolitatud (STRING str, STRING pat) massiivi Jagab str ümber pat (pat on regulaaravaldis).
str_to_map(tekst[, eraldaja1, eraldaja2]) kaart See jagab teksti võtme-väärtuse paarideks kahe eraldaja abil. Delimiter1 eraldab paarid ja delimiter2 jagab iga paari.

Muu Funktsioonid

Mitmed sisseehitatud funktsioonid ei kuulu ühtegi ülaltoodud perekonda. Need hõlmavad räsimist, seansiinfot ja suvaliste funktsioonide kutsumist. Java meetodid.

Funktsiooni nimi Tagastuse tüüp Kirjeldus
räsi(a1[, a2…]) INT Tagastab argumentide räsiväärtuse
praegune_kasutaja() nöör Tagastab konfigureeritud autentimishaldurist praeguse kasutajanime
praegune_andmebaas() nöör Tagastab praeguse andmebaasi nime
md5(string/binaarne) nöör Tagastab MD5 128-bitise kontrollsumma 32 kuueteistkümnendsüsteemi numbrist koosneva stringina või NULL-i NULL-argumendi korral.
sha1(string/binaarne) nöör Tagastab argumendi SHA-1 lühendi kuueteistkümnendsüsteemis stringina.
crc32(string/binaarne) BigInt Tagastab stringi või binaarargumulli tsüklilise redundantsuse kontrolli väärtuse.
versioon() nöör Tagastab Hive'i versiooni ehitusnumbrina, millele järgneb ehitusräsi.
peegelda(klass, meetod[, arg1…]) varieerub Kõned a Java meetod argumendi signatuuri sobitamise teel, kasutades peegeldust. java_method() on sünonüüm

UDF-id (kasutaja määratud funktsioonid)

Hive'is saavad kasutajad kliendi teatud nõuete täitmiseks defineerida oma funktsioone. Neid nimetatakse Hive'is UDF-ideks. Kasutaja defineeritud funktsioonid on kirjutatud keeles Java konkreetsete moodulite jaoks.

Mõned UDF-id on spetsiaalselt loodud koodi korduvkasutatavuse tagamiseks rakendusraamistikes. Arendaja kirjutab need funktsioonid Java ja integreerib need UDF-id Hive'iga.

Päringu täitmise ajal saab arendaja koodi otse kasutada ja UDF-id tagastavad väljundeid vastavalt kasutaja määratletud ülesannetele. See pakub kodeerimise ja täitmise osas suurt jõudlust.

Näiteks stringi tüve loomiseks pole meil Hive'is ühtegi eelnevalt määratletud funktsiooni. Selle jaoks saame kirjutada tüve UDF-i JavaKus iganes vajame tüve funktsionaalsust, saame seda tüve UDF-i Hive'is otse kutsuda.

Tüvefunktsionaalsus tähendab siin sõnade tuletamist nende tüvisõnadest. Tüvestumise algoritm taandab sõnad „wishing“, „wished“ ja „wishes“ tüvesõnaks „wish“. Seda tüüpi funktsionaalsuse teostamiseks saame kirjutada UDF-i Java ja integreerige see Mesilaspere.

Sõltuvalt kasutusjuhtumist saab UDF-i kirjutada nii, et see aktsepteerib ja genereerib erinevat arvu sisend- ja väljundväärtusi.

Üldine UDF-tüüp aktsepteerib ühte sisendväärtust ja annab ühe väljundväärtuse. Kui UDF-i kasutatakse päringus, kutsutakse seda tulemuste andmestiku iga rea ​​jaoks üks kord.

Teises suunas saab funktsioon sisendiks võtta väärtuste rühma ja tagastada ka ühe väljundväärtuse. See erinevus eristabki järgnevalt kirjeldatud kolme kohandatud funktsiooni tüüpi.

UDF vs UDAF vs UDTF tarus

Hive'i kohandatud funktsioonid on rühmitatud sisestatavate ja väljuvate ridade arvu järgi. Vale tüübi valimine on kõige levinum põhjus, miks kohandatud funktsioon keeldub kompileerimisest või tagastab ühe rea tabeli asemel.

KASUTUSALA Read sisse → read välja Klass laiendamiseks Sisseehitatud näited
UDF Üks rida → üks rida org.apache.hadoop.hive.ql.exec.UDF pikkus(), ümar(), tagurpidi()
UDAF Mitu rida → üks rida org.apache.hadoop.hive.ql.udf.generic.AbstractÜldine UDAF-lahendaja loendur(), min(), max()
UDTF Üks rida → palju ridu org.apache.hadoop.hive.ql.udf.generic.GenericUDTF explode(), json_tuple(), parse_url_tuple()

Tabelist tulenevad kaks praktilist reeglit:

  • UDAF-i kasutatakse peaaegu alati koos GROUP BY -klausliga, kuna see koondab iga rühma ühele reale.
  • UDTF-i ei saa valida koos teiste veergudega samas SELECT-loendis, seega kasutatakse seda tavaliselt koos LATERAL VIEW-ga.

Samuti on olemas teine, võimekam baasklass rea tasemel tööks, GenericUDF, mis aktsepteerib keerukaid tüüpe nagu massiivid, kaardid ja struktuurid ning muutuv arv argumente.

Kuidas kirjutada ja registreerida UDF-i Hive'is

Ülalkirjeldatud tüve näidet saab reaalfunktsioonina luua neljas etapis. Mitte midagi peale Java Vajalik on kompilaator ja töötav Hive'i seanss.

Step 1) Kirjuta Java Klass, mis laiendab UDF-i ja rakendab avaliku evaluate() meetodi. Hive kutsub evaluate() funktsiooni üks kord rea kohta, seega peab meetod käsitlema NULL sisendit.

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

Step 2) Kompileeri klass ja paki see koos kõigi klassidega, millest see sõltub, JAR-faili, näiteks hive-udf-1.0.jar.

Step 3) Pane JAR Hive'i klassiteele ja seo klassiga funktsiooni nimi. Ajutine funktsioon eksisteerib ainult praeguse seansi jaoks.

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

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

Step 4) Kutsuge uut funktsiooni välja täpselt nagu sisseehitatud funktsiooni. Rakendatuna sõnadele „wishing“, „wished“ ja „wishes“, tagastab see klass kõigi kolme puhul „wish“.

SELECT word, stem(word) FROM words;

Funktsiooni kättesaadavaks tegemiseks igale seansile ja igale kasutajale registreerige see jäädavalt andmebaasis. JAR peab asuma teel, mida kogu klaster saab lugeda, mis tavaliselt tähendab HDFS-i.

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

Üks klass võib deklareerida mitu evaluate() meetodit. Hive sobitab kutse argumendi signatuuridega, nii saab üks funktsioon aktsepteerida nii stringi kui ka täisarvu.

KKK

SHOW FUNCTIONS loetleb kõik registreeritud nimed, kaasa arvatud kohandatud nimed. DESCRIBE FUNCTION nimi prindib üherealise allkirja ja DESCRIBE FUNCTION EXTENDED nimi lisab kasutusnäiteid, kui rakendav klass need pakub.

Peaaegu alati on tegemist nime või ulatuse probleemiga: AS-i järgnev string peab olema täielikult kvalifitseeritud klassi nimi ja ADD JAR kehtib ainult seansi kohta, mis seda käivitas. Uuesti ühendamisel kaob nii JAR kui ka kõik ajutised funktsioonid.

Kasutage GenericUDF-i, kui funktsioon võtab vastu keerukaid tüüpe, näiteks massiive, kaarte või struktuure, muutuvat arvu argumente või peab ise argumentide tüüpe valideerima. Lihtne UDF-klass lahendab tüübid peegelduse abil ja käsitleb ainult primitiivseid kirjutatavaid elemente.

Tõeline UDF peab JVM-il töötama. Teiste keelte puhul Mesilaspere pakub TRANSFORM-klauslit, mis voogedastab iga rea ​​välise skripti kaudu, näiteks Python tavalise sisendi ja väljundi asemel. See on aeglasem, aga väldib Java täielikult.

Nad saavad. evaluate() töötab üks kord rea kohta, seega korrutatakse kallis loogika ridade arvuga ja objektide eraldamine meetodi sees lisab prügikoristussurvet. Eelista sisseehitatud funktsiooni, kui see on olemas, ja hoia evaluate() sisend-/väljundvabana.

Ei. Funktsioonide nimed lahendavad tähesuurust sõltumatult, seega ROUND(), Round() ja round() on sama funktsioon. Java Klassi nimi AS-klauslis on teine ​​​​asi ja see peab täpselt vastama kompileeritud klassile, kaasa arvatud selle pakett.

Masinõppe assistendid kaardistavad kandidaatide signatuuridele lihtkeelse kirjelduse ja hoiatavad, kui tagastustüüp ei sobi sihtveeruga. Kontrollige soovitust dokumenteeritud signatuuri suhtes, sest genereeritud nimed kuuluvad mõnikord teise SQL-dialekti.

See loob operatsiooni kirjeldavast kommentaarist kasutatava skeleti – klassi deklaratsiooni, impordi ja meetodi evaluate(). Nullväärtuste käsitlemine, kirjutatavad tüübid ja pakkimisetapp vajavad veel ülevaatamist ning funktsiooni tuleb testida päris ridadel.

Võta see postitus kokku järgmiselt: