Apache Pig UDF: 3. dio - funkcije pohrane

Ovaj post opisuje funkcije Apache Pig UDF - Store. (Apache Pig UDF: 3. dio). Pogledajte funkcije pohrane Apache Pig UDF.

Apstraktna klasa StoreFunc ima glavne metode za pohranu podataka i za većinu slučajeva korištenja trebalo bi biti dovoljno da se ona proširi. Postoji neobavezno sučelje koje se može implementirati za postizanje proširene funkcionalnosti:





što je prostor imena c ++

StoreMetadata

Ovo sučelje ima metode interakcije sa sustavima metapodataka za pohranu sheme i statistike. Ovo sučelje nije obavezno i ​​trebalo bi ga implementirati samo ako treba pohraniti metapodatke.

U nastavku su objašnjene metode koje treba nadjačati u StoreFunc:



  • getOutputFormat ():

    Ovu će metodu pozvati Pig da bi dobio OutputFormat koji koristi Storer. Metode u OutputFormat pozvat će Pig na isti način i u istom kontekstu kao i Hadoop u Java programu za smanjenje karte. Ako je OutputFormat paket s Hadoop-om, implementacija bi trebala koristiti novi API zasnovan pod org.apache.hadoop.mapreduce. Ako se radi o prilagođenom OutputFormat-u, treba ga implementirati pomoću novog API-ja pod org.apache.hadoop.mapreduce. Metoda checkOutputSpecs () OutputFormat-a pozvat će prase kako bi provjerila izlazno mjesto unaprijed. Ova će se metoda također pozivati ​​kao dio sekvence poziva Hadoop kada se posao pokrene. Dakle, implementacije bi trebale osigurati da se ova metoda može pozvati više puta bez neskladnih nuspojava.

  • setStoreLocation ():

    Ovu metodu svinja poziva da prodavatelju priopći mjesto trgovine. Spremnik bi trebao koristiti ovu metodu za priopćavanje istih podataka u osnovni OutputFormat. Ovu metodu svinja više puta poziva. Implementacije trebaju uzeti u obzir da se ova metoda poziva više puta i treba osigurati da zbog višestrukih poziva nema nedosljednih nuspojava.

  • pripremaToWrite ():

    U novom API-ju, upisivanje podataka vrši se kroz OutputFormat koji pruža StoreFunc. U pripremToWrite () RecordWriter pridružen OutputFormat-u koji pruža StoreFunc prosljeđuje se StoreFunc-u. RecordWriter se zatim može koristiti implementacijom u putNext () za pisanje korice koja predstavlja zapis podataka na način koji očekuje RecordWriter.

  • putNext ():

    Značenje putNext () nije se promijenilo i Pig runtime ga poziva da napiše sljedeću gomilu podataka - u novom API-u, ovo je metoda u kojoj će implementacija koristiti temeljni RecordWriter za ispisivanje Tuplea.

Zadane implementacije u StoreFunc:

  • setStoreFuncUDFContextSignature ():

    Ovu će metodu svinja pozvati i na prednjem i na stražnjem kraju kako bi pohranili jedinstveni potpis. Potpis se može koristiti za pohranjivanje bilo kakvih podataka u UDFContext koje skladište treba pohraniti između različitih poziva metoda u prednjem i stražnjem kraju. Zadana implementacija u StoreFunc ima prazno tijelo. Ova će se metoda pozvati prije bilo koje druge metode.

  • relToAbsPathForStoreLocation ():

    Svinja za vrijeme izvođenja pozvat će ovu metodu kako bi omogućila skladištu da pretvori relativno mjesto trgovine u apsolutno mjesto. Implementacija je osigurana u StoreFunc koja to obrađuje za lokacije temeljene na FileSystemu.

  • checkSchema ():

    Funkcija Store trebala bi implementirati ovu funkciju kako bi provjerila da li joj je prihvatljiva zadana shema koja opisuje podatke koji se zapisuju. Zadana implementacija u StoreFunc ima prazno tijelo. Ova će se metoda pozivati ​​prije bilo kakvih poziva setStoreLocation ().

Primjer provedbe:

Implementacija spremišta u primjeru je spremište za tekstualne podatke s razgraničiteljem crte kao ‘
‘I‘ ‘kao zadani graničnik polja (koji se može nadjačati dodavanjem drugog graničnika polja u konstruktoru) - ovo je slično trenutnom spremištu PigStorage u Pig-u. Implementacija koristi postojeći Hadoop podržani OutputFormat - TextOutputFormat kao temeljni OutputFormat.

java kako koristiti iterator
javna klasa SimpleTextStorer proširuje StoreFunc {zaštićeni zapisnik RecordWriter = null privatni bajt fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (graničnik niza) {this ( ) if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if (delimiter.length ()> 1delimiter.charAt (0) == '') {switch ( delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x': fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () case case ' u ': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: baciti novi RuntimeException (' Nepoznati graničnik '+ graničnik)}} else {baciti novi RuntimeException (' PigStorage delimetar mora biti jedan znak ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) baca IOException {int sz = f.size () for (int i = 0 i

Imate pitanje za nas? Molimo vas da ih spominjete u odjeljku za komentare i javit ćemo vam se.

Vezane objave:



Apache Pig UDF: 2. dio
Apache Pig UDF: 1. dio