Hive funkcije: Primjer ugrađenih i UDF (korisnički definiranih) funkcija

⚡ Pametni sažetak

Hive funkcije se dijele u dvije skupine: ugrađene funkcije koje dolaze s engineom i pokrivaju kolekcije, datume, matematičke, uvjetne, string i razne poslove, te korisnički definirane funkcije napisane u Java za logiku koju Hive ne nudi.

  • 📚 Šest ugrađenih obitelji: Funkcije za kolekcije, datume, matematičke, uvjetne, string i razne funkcije mogu se pozvati izravno unutar HiveQL-a.
  • 🧾 Potpisi su važni: Svaka funkcija ima fiksni popis argumenata i dokumentirani tip povratne vrijednosti, tako da tip povratne vrijednosti određuje gdje se može koristiti.
  • 🧩 UDF popunjava praznine: Kada ne postoji ugrađena funkcija, a Java Klasa koja proširuje org.apache.hadoop.hive.ql.exec.UDF osigurava nedostajuću operaciju.
  • 🔢 Tri oblika prilagođene funkcije: UDF vraća jedan redak po retku, UDAF sažima više redaka u jedan, a UDTF proširuje jedan redak u više.
  • 🛠️ Registracija u dva koraka: ADD JAR stavlja kod na putanju klase, a CREATE TEMPORARY FUNCTION veže ime na klasu.
  • ♻️ Poanta je u ponovnoj upotrebi: Jedan testirani UDF, kao što je stemmer, može se pozvati iz svakog upita umjesto da se svaki put prepisuje.

Hive funkcije: Ugrađene i korisnički definirane funkcije

Funkcije su izgrađene za određenu svrhu za izvođenje operacija poput matematičkih, aritmetičkih, logičkih i relacijskih operacija na operandima naziva stupaca tablice.

Ugrađene funkcije

Ovo su funkcije koje su već dostupne u Hiveu. Prvo moramo provjeriti zahtjeve aplikacije, a zatim možemo koristiti ove ugrađene funkcije u našim aplikacijama. Ove funkcije možemo pozvati izravno u našoj aplikaciji.

Sintaksa i tipovi navedeni su u sljedećem odjeljku.

Vrste ugrađenih funkcija u Hiveu:

  • Funkcije prikupljanja
  • Datumske funkcije
  • Matematičke funkcije
  • Uvjetne funkcije
  • Funkcije nizova
  • Razno. Funkcije

Svaka od šest obitelji obrađena je u nastavku sa svojim potpisima funkcija i tipovima povrata.

Funkcije prikupljanja

Ove funkcije se koriste za kolekcije. Kolekcije znače grupuping elemenata, a vraćaju jedan element ili niz elemenata ovisno o tipu povrata spomenutom u nazivu funkcije.

Tip povrata Naziv funkcije Description
INT veličina (karta ) Dohvatit će i dati broj komponenti u tipu mape
INT veličina (niz ) Dohvatit će i dati broj elemenata u tipu polja
Niz ključevi_mape(Karta ) Dohvatit će i vratiti niz koji sadrži ključeve ulazne mape. Niz je neuređen.
Niz vrijednosti_karte(Karta ) Dohvatit će i vratiti niz koji sadrži vrijednosti ulazne mape. Niz je neuređen.
Niz sort_array(Niz ) Sortira ulazni niz u rastućem redoslijedu elemenata i vraća ga
Booleova niz_sadrži(Niz , vrijednost) Vraća TRUE ako niz sadrži vrijednost proslijeđenu kao drugi argument

Datumske funkcije

Koriste se za manipulaciju datumima i pretvorbu tipova datuma iz jednog tipa u drugi:

Naziv funkcije Tip povrata Description
unix_timestamp() BIGINT Dobit ćemo struju Unix vremenska oznaka u sekundama. Vrijednost nije fiksna za cijeli upit
datum_do(niz_vremenske_oznake) podaci Dohvatit će i dati datumski dio vremenskog pečata
godina (string datum) INT Dohvatit će i dati godinu kao dio datuma ili niza vremenske oznake
kvartal(datum/vremenska oznaka/niz) INT Dohvatit će i dati kvartal u godini za datum, vremensku oznaku ili niz u rasponu od 1 do 4
mjesec (string datum) INT Dat će mjesecu dio datuma ili niz vremenske oznake
sat (string datum) INT Dohvatit će i dati sat vremenske oznake
minuta (string datum) INT Dohvatit će i dati minutu vremenske oznake
date_sub(string početni datum, cijeli broj dana) podaci Dohvatit će i dati rezultat podređenogtracnekoliko dana od početnog datuma
trenutni_datum podaci Dohvatit će i dati trenutni datum na početku evaluacije upita
zadnji_dan(niz znakova datuma) niz Dohvatit će i dati posljednji dan u mjesecu kojem datum pripada
trunc(datum niza, format niza) niz Dohvatit će i vratiti datum skraćen na jedinicu određenu formatom. Podržani formati: MJESEC/MON/MM, GODINA/GGGG/GG.

Matematičke funkcije

Ove se funkcije koriste za matematičke operacije. Umjesto stvaranja UDF-ova, u Hiveu imamo neke ugrađene matematičke funkcije.

Naziv funkcije Tip povrata Description
okruglo (DOUBLE X) DVOSTRUKO Dohvatit će i vratiti zaokruženu BIGINT vrijednost X-a.
okruglo (DOUBLE X, INT d) DVOSTRUKO Dohvatit će i vratiti X zaokruženo na d decimalnih mjesta
smeđa (DOUBLE X) DVOSTRUKO Dohvatit će i vratiti zaokruženu BIGINT vrijednost X koristeći HALF_EVEN način zaokruživanja, također poznat kao bankarsko zaokruživanje.
kat (DOUBLE X) BIGINT Dohvatit će i vratiti maksimalnu BIGINT vrijednost koja je jednaka ili manja od X vrijednosti.
strop (DOUBLE a), strop (DOUBLE a) BIGINT Dohvatit će i vratiti minimalnu BIGINT vrijednost koja je jednaka ili veća od vrijednosti a
rand(), rand(INT sjeme) DVOSTRUKO Dohvatit će i vratiti slučajni broj koji je jednoliko raspoređen od 0 do 1. Navođenje početne vrijednosti čini niz ponovljivim.

Uvjetne funkcije

Ove funkcije se koriste za provjeru uvjetnih vrijednosti.

Naziv funkcije Tip povrata Description
if(Boolean testCondition, T valueTrue, T valueFalseOrNull) T Vratit će vrijednost valueTrue kada je testCondition istinit, a u suprotnom vrijednost valueFalseOrNull.
nije null(X) Booleova Dohvatit će i vratiti vrijednost true ako je X NULL, a u suprotnom će vratiti vrijednost false.
nije null(X) Booleova Dohvatit će i vratiti vrijednost true ako X nije NULL, a u suprotnom će vratiti vrijednost false.
nvl(T vrijednost, T zadana_vrijednost) T Vratit će default_value kada je value NULL, a value inače.

Funkcije nizova

Manipulacije stringova i operacije s stringovima obrađuju se sljedećim funkcijama.

Naziv funkcije Tip povrata Description
obrnuto(niz X) niz To će dati obrnuti niz X
rpad(string str, int duljina, string pad) niz Dohvatit će i dati str desno dopunjen s dopunom do ukupne duljine length
rtrim(niz znakova X) niz Dohvatit će i vratiti niz koji je rezultat obrezivanja razmaka s kraja (desne strane) X-a.
Na primjer, rtrim(' rezultati ') rezultira ' rezultatima'
razmak (INT n) niz Dohvatit će i dati niz od n razmaka.
split(STRING str, STRING pat) poredak Rastavlja str oko pat (pat je regularni izraz).
str_u_mapu(tekst[, delimiter1, delimiter2]) karta Podijelit će tekst na parove ključ-vrijednost pomoću dva razdjelnika. Razdjelnik1 odvaja parove, a razdjelnik2 dijeli svaki par.

Razno. Funkcije

Nekoliko ugrađenih funkcija ne pripada nijednoj od gore navedenih obitelji. One obuhvaćaju hashiranje, informacije o sesiji i pozivanje proizvoljnih Java metode.

Naziv funkcije Tip povrata Description
hash(a1[, a2…]) INT Vraća hash vrijednost argumenata
trenutni_korisnik() niz Vraća trenutno korisničko ime iz konfiguriranog upravitelja autentifikatora
trenutna_baza_podataka() niz Vraća naziv trenutne baze podataka
md5(niz/binarni) niz Vraća MD5 128-bitnu kontrolnu sumu kao niz od 32 heksadecimalne znamenke ili NULL za NULL argument
sha1(niz znakova/binarna datoteka) niz Vraća SHA-1 sažetak argumenta kao heksadecimalni niz
crc32(niz/binarni) BIGINT Vraća vrijednost cikličke provjere redundancije niza znakova ili binarnog argumenta
verzija() niz Vraća verziju Hivea kao broj verzije nakon kojeg slijedi hash verzije
odražavati(klasa, metoda[, arg1…]) varira Pozivi Java metoda usklađivanjem potpisa argumenta, korištenjem refleksije. java_method() je sinonim

UDF-ovi (korisnički definirane funkcije)

U Hiveu korisnici mogu definirati vlastite funkcije kako bi zadovoljili određene zahtjeve klijenta. One su u Hiveu poznate kao UDF-ovi. Korisnički definirane funkcije napisane su u Java za određene module.

Neki UDF-ovi su posebno dizajnirani za ponovnu upotrebu koda u aplikacijskim okvirima. Programer piše ove funkcije u Java i integrira te UDF-ove s Hiveom.

Tijekom izvršavanja upita, programer može izravno koristiti kod, a UDF-ovi će vraćati izlaze prema korisnički definiranim zadacima. To pruža visoke performanse u smislu kodiranja i izvršavanja.

Na primjer, za stemming stringova nemamo unaprijed definiranu funkciju u Hiveu. Za to možemo napisati stem UDF u JavaGdje god nam je potrebna funkcionalnost stema, možemo izravno pozvati ovaj UDF stema u Hiveu.

Ovdje funkcionalnost korijena znači izvođenje riječi iz njihovih korijenskih riječi. Algoritam za izvođenje korijena reducira riječi „željeti“, „želio“ i „želi“ na korijensku riječ „želja“. Za izvođenje ove vrste funkcionalnosti možemo napisati UDF u Java i integrirati ga sa Košnica.

Ovisno o slučaju upotrebe, UDF se može napisati tako da prihvaća i proizvodi različit broj ulaznih i izlaznih vrijednosti.

Opći tip UDF-a prihvaća jednu ulaznu vrijednost i proizvodi jednu izlaznu vrijednost. Ako se UDF koristi u upitu, tada će se UDF pozvati jednom za svaki redak u skupu rezultata podataka.

U drugom smjeru, funkcija može prihvatiti skupinu vrijednosti kao ulaz i vratiti jednu izlaznu vrijednost. Ta razlika je ono što razdvaja tri vrste prilagođenih funkcija opisanih u nastavku.

UDF vs UDAF vs UDTF u Hiveu

Prilagođene funkcije u Hiveu grupirane su prema broju redaka koji ulaze i koliko izlaze. Odabir pogrešnog tipa najčešći je razlog zašto prilagođena funkcija odbija kompajlirati ili vraća jedan redak tamo gdje se očekivala tablica.

Tip Redovi unutra → redovi van Klasa za proširenje Ugrađeni primjeri
UDF Jedan red → jedan red org.apache.hadoop.hive.ql.exec.UDF duljina(), zaokruživanje(), obrnuto()
UDAF Više redaka → jedan redak org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver broj(), min(), maks()
UDTF Jedan red → više redova org.apache.hadoop.hive.ql.udf.generic.GenericUDTF explode(), json_tuple(), parse_url_tuple()

Iz tablice slijede dva praktična pravila:

  • UDAF je gotovo uvijek uparen s klauzulom GROUP BY jer sažima svaku grupu u jedan redak.
  • UDTF se ne može odabrati uz druge stupce u istoj SELECT listi, pa se obično koristi s LATERAL VIEW-om.

Postoji i druga, sposobnija osnovna klasa za rad na razini redova, GenericUDF, koja prihvaća složene tipove poput nizova, mapa i struktura te varijabilan broj argumenata.

Kako napisati i registrirati UDF u Hiveu

Primjer stema opisan gore može se izgraditi kao stvarna funkcija u četiri koraka. Ništa više od Java potreban je kompajler i pokrenuta Hive sesija.

Korak 1) Napiši a Java klasa koja proširuje UDF i implementira javnu metodu evaluate(). Hive poziva evaluate() jednom po retku, tako da metoda mora obraditi NULL ulaz.

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

Korak 2) Kompajlirajte klasu i zapakirajte je u JAR datoteku, na primjer hive-udf-1.0.jar, zajedno sa svim klasama o kojima ovisi.

Korak 3) Stavite JAR na put klase Hive i vežite naziv funkcije za klasu. Privremena funkcija traje samo tijekom trenutne sesije.

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

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

Korak 4) Pozovite novu funkciju točno kao ugrađenu. Primijenjena na riječi "wishing", "wished" i "wishes", ova klasa vraća "wish" za sve tri.

SELECT word, stem(word) FROM words;

Da bi funkcija ostala dostupna svakoj sesiji i svakom korisniku, umjesto toga je trajno registrirajte u bazi podataka. JAR mora biti na putanji koju cijeli klaster može pročitati, što obično znači HDFS.

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

Jedna klasa može deklarirati više od jedne metode evaluate(). Hive uspoređuje poziv s potpisima argumenata, što znači da jedna funkcija može prihvatiti i niz znakova i cijeli broj.

Pitanja i odgovori

SHOW FUNCTIONS navodi svako registrirano ime, uključujući i prilagođena. DESCRIBE FUNCTION ime ispisuje potpis u jednom retku, a DESCRIBE FUNCTION EXTENDED ime dodaje primjere upotrebe tamo gdje ih implementacijska klasa navodi.

Gotovo uvijek problem s imenom ili opsegom: niz znakova nakon AS mora biti potpuno kvalificirano ime klase, a ADD JAR se odnosi samo na sesiju koja ga je pokrenula. Ponovno povezivanje briše i JAR i sve privremene funkcije.

Koristite GenericUDF kada funkcija uzima složene tipove kao što su nizovi, mape ili strukture, varijabilan broj argumenata ili kada sama treba validirati tipove argumenata. Jednostavna UDF klasa razrješava tipove refleksijom i obrađuje samo primitivne objekte za pisanje.

Pravi UDF mora se izvršavati na JVM-u. Za ostale jezike, Košnica nudi TRANSFORM klauzulu koja svaki redak struji kroz vanjski skript kao što je Python preko standardnog ulaza i izlaza. Sporiji je, ali izbjegava Java u cijelosti.

Mogu. evaluate() se izvršava jednom po retku, pa se skupa logika množi s brojem redaka, a alokacija objekata unutar metode dodaje pritisak skupljanja smeća. Poželjno je koristiti ugrađenu funkciju ako postoji i evaluate() ne smije biti uključen u I/O.

Ne. Nazivi funkcija se rješavaju neovisno o velikim i malim slovima, pa su ROUND(), Round() i round() iste funkcije. Java Naziv klase u AS klauzuli je druga stvar i mora točno odgovarati kompiliranoj klasi, uključujući i njen paket.

Pomoćnici za strojno učenje mapiraju opis na običnom jeziku na kandidatske potpise i upozoravaju kada tip povrata ne odgovara ciljnom stupcu. Provjerite prijedlog u odnosu na dokumentirani potpis, jer generirana imena ponekad pripadaju drugom SQL dijalektu.

Iz komentara koji opisuje operaciju stvara upotrebljiv kostur - deklaraciju klase, uvoze i metodu evaluate(). Rukovanje null vrijednostima, tipovi za pisanje i korak pakiranja još uvijek trebaju pregled, a funkcija se mora testirati na stvarnim retcima.

Sažmite ovu objavu uz: