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 iImate pitanje za nas? Molimo vas da ih spominjete u odjeljku za komentare i javit ćemo vam se.
Vezane objave: