A StoreFunc absztrakt osztály rendelkezik az adatok tárolásának fő módszereivel, és a legtöbb felhasználási esetben elegendő lenne kibővíteni. Van egy opcionális interfész, amely megvalósítható a kibővített funkcionalitás elérése érdekében:
StoreMetadata
Ennek az interfésznek módszerei vannak a metaadat-rendszerekkel való interakcióra a sémák és statisztikák tárolására. Ez az interfész nem kötelező, és csak akkor valósítható meg, ha metaadatokat kell tárolni.
A StoreFunc-ban felülírandó módszereket az alábbiakban ismertetjük:
hogyan készítsünk halmazt
getOutputFormat ():
Ezt a módszert Pig hívja meg, hogy megszerezze az OutputFormatot, amelyet a Tároló használ. Az OutputFormat módszereit Pig ugyanúgy meghívja, mint Hadoop egy térképcsökkentő Java programban. Ha az OutputFormat egy Hadoop csomagolt, akkor a megvalósításnak az org.apache.hadoop.mapreduce alatt az új API-alapúat kell használnia. Ha ez egy egyedi OutputFormat, akkor azt az új API segítségével kell végrehajtani az org.apache.hadoop.mapreduce alatt. A sertés meghívja az OutputFormat checkOutputSpecs () metódusát, hogy ellenőrizze a kimenet helyét előre. A feladat indításakor ezt a módszert a Hadoop hívássorozat részeként is meghívják. Tehát a megvalósításoknak biztosítaniuk kell, hogy ezt a módszert többször lehessen hívni következetlen mellékhatások nélkül.
setStoreLocation ():
Ezt a módszert Pig hívja meg, hogy közölje az üzlet helyét a tárolóval. A tárolónak ezt a módszert kell használnia, hogy ugyanazokat az információkat közölje az alapul szolgáló OutputFormat-tal. Ezt a módszert Pig többször is hívja. A megvalósításoknak figyelembe kell venniük, hogy ezt a módszert többször hívják, és biztosítaniuk kell, hogy ne legyenek következetlen mellékhatások a többszörös hívások miatt.
preparToWrite ():
Az új API-ban az adatok írása a StoreFunc által biztosított OutputFormaton keresztül történik. Az PreparToWrite () fájlban a StoreFunc által biztosított OutputFormathoz társított RecordWriter átkerül a StoreFunc-nak. Ezután a putNext () implementációja felhasználhatja a RecordWriter-t az adatok rekordját reprezentáló duplák írására a RecordWriter által elvárt módon.
putNext ():
A putNext () jelentése nem változott, és a Pig futásidejű alkalmazás arra hívta fel, hogy megírja a következő adatcsoportot - az új API-ban ez az a módszer, ahol a megvalósítás az alapul szolgáló RecordWritert használja a Tuple kiírására.
Alapértelmezett megvalósítások a StoreFunc-ben:
setStoreFuncUDFContextSignature ():
Ezt a módszert Pig mind az elülső, mind a hátsó végén meghívja, hogy egyedi aláírást adjon át a Tárolónak. Az aláírással bármilyen olyan információ tárolható az UDFContextben, amelyet a Tárolónak tárolnia kell a különböző metódusok meghívásai között az elülső és a hátsó végén. Az alapértelmezett megvalósítás a StoreFunc-ban üres. Ezt a módszert minden más módszer előtt meghívják.
relToAbsPathForStoreLocation ():
A Pig futásideje ezt a módszert hívja meg, hogy a Tároló relatív tárolóhelyet abszolút hellyé alakítson át. A StoreFunc egy megvalósítást biztosít, amely ezt kezeli a FileSystem alapú helyeken.
checkSchema ():
A Store függvénynek végre kell hajtania ezt a funkciót annak ellenőrzésére, hogy az írandó adatokat leíró adott séma elfogadható-e számára. A StoreFunc alapértelmezett megvalósításának üres törzse van. Ezt a módszert a setStoreLocation () hívás előtt hívjuk meg.
Példa megvalósításra:
A példa tároló megvalósítása a szöveges adatok tárolója, sorhatárolóval:
Alapértelmezett mezőhatároló (és felülírható egy másik mezőhatároló átadásával a konstruktorban) - ez hasonló a Pig Pigtor jelenlegi PigStorage tárolójához. A megvalósítás egy meglévő Hadoop által támogatott OutputFormat - TextOutputFormat elemet használ alapul szolgáló OutputFormatként.
public class SimpleTextStorer kiterjeszti a StoreFunc {védett RecordWriter író = null privát byte fieldDel = '' privát statikus végső int BUFFER_SIZE = 1024 privát statikus végső karakterlánc UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (String elválasztó) {this ( ) if (elhatároló.hossz () == 1) {this.fieldDel = (bájt) delimiter.charAt (0)} else if (elhatároló.hossz ()> 1delimiter.charAt (0) == '') {kapcsoló ( delimiter.charAt (1)) {eset 't': this.fieldDel = (byte) '' break case 'x': fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () break case ' u ': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break alapértelmezett: dobjon új RuntimeException (' Ismeretlen határoló '+ elválasztó)}} else {dobjon új RuntimeException (' A PigStorage határolójának a egyetlen karakter ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Orride public void putNext (Tuple f) IOException {int sz = f.size () for (int i = 0 i)Van egy kérdésünk? Kérjük, említse meg őket a megjegyzések részben, és mi kapcsolatba lépünk Önnel.
Kapcsolódó hozzászólások: