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.

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.
