StoreFunc-abstraktiluokalla on päämenetelmät tietojen tallentamiseen, ja useimmissa käyttötapauksissa sen laajentamisen pitäisi riittää. On valinnainen käyttöliittymä, joka voidaan toteuttaa laajennetun toiminnallisuuden saavuttamiseksi:
StoreMetadata
Tässä käyttöliittymässä on menetelmiä vuorovaikutuksessa metatietojärjestelmien kanssa skeeman ja tilastojen tallentamiseksi. Tämä käyttöliittymä on valinnainen, ja se tulisi ottaa käyttöön vain, jos metatiedot on tallennettava.
Menetelmät, jotka on ohitettava StoreFuncissa, selitetään alla:
javascript saada taulukon koko
getOutputFormat ():
Sika kutsuu tätä menetelmää saadakseen Varastimen käyttämän OutputFormatin. Pig kutsuu OutputFormatissa olevia menetelmiä samalla tavalla ja samassa yhteydessä kuin Hadoop kartan pienentävässä Java-ohjelmassa. Jos OutputFormat on Hadoop-pakattu, toteutuksen tulisi käyttää uutta API-pohjaista API org.apache.hadoop.mapreduce -kohdassa. Jos se on mukautettu OutputFormat, se tulisi toteuttaa uudella sovellusliittymällä kohdassa org.apache.hadoop.mapreduce. Sika kutsuu OutputFormatin CheckOutputSpecs () -menetelmän tarkistamaan lähtöpaikan edestä. Tätä menetelmää kutsutaan myös osana Hadoop-puhelusarjaa, kun työ käynnistetään. Joten toteutusten tulisi varmistaa, että tätä menetelmää voidaan kutsua useita kertoja ilman epäjohdonmukaisia sivuvaikutuksia.
setStoreLocation ():
Sika kutsuu tätä menetelmää välittämään myymälän sijainnin varastolle. Varastajan tulisi käyttää tätä menetelmää välittäessään samat tiedot taustalla olevalle OutputFormatille. Sika kutsuu tätä menetelmää useita kertoja. Toteutusten tulisi ottaa huomioon, että tätä menetelmää kutsutaan useita kertoja, ja sen on varmistettava, ettei useista puheluista johdu epäjohdonmukaisia sivuvaikutuksia.
PreparToWrite ():
Uudessa sovellusliittymässä tiedot kirjoitetaan StoreFuncin tarjoaman OutputFormatin kautta. Kohdassa PreparToWrite () StoreFuncin toimittamaan OutputFormatiin liittyvä RecordWriter välitetään StoreFuncille. Tällöin putNext () -sovelluksen toteutus voi käyttää RecordWriter-ohjelmaa kirjoittamaan tietuetiedostoa edustavan sekvenssin RecordWriterin odottamalla tavalla.
putNext ():
PutNext (): n merkitys ei ole muuttunut, ja Pig Runtime kutsuu sitä kirjoittamaan seuraavan tietosarjan - uudessa sovellusliittymässä tämä on menetelmä, jossa toteutus käyttää alla olevaa RecordWriteria Tuplen kirjoittamiseen.
Oletustoteutukset StoreFuncissa:
setStoreFuncUDFContextSignature ():
Sika kutsuu tätä menetelmää sekä etu- että takapäässä välittämään ainutlaatuisen allekirjoituksen Varastajalle. Allekirjoitusta voidaan käyttää tallentamaan kaikki tiedot UDFContextiin, jotka Varastajan on tallennettava eri käyttöliittymien välillä käyttöliittymässä ja takana. StoreFuncin oletustoteutuksessa on tyhjä runko. Tätä menetelmää kutsutaan ennen muita menetelmiä.
relToAbsPathForStoreLocation ():
Pig-ajonaika kutsuu tätä menetelmää, jotta Varastaja voi muuntaa suhteellisen myymälän sijainnin absoluuttiseksi sijainniksi. StoreFuncissa on toteutus, joka käsittelee tämän FileSystem-pohjaisiin sijainteihin.
checkSchema ():
Store-funktion tulisi toteuttaa tämä toiminto tarkistaakseen, että tietty kaava, joka kuvaa kirjoitettavia tietoja, on sille hyväksyttävä. StoreFuncin oletustoteutuksessa on tyhjä runko. Tätä menetelmää kutsutaan ennen setStoreLocation () -kutsuja.
Esimerkkitoteutus:
Esimerkissä oleva varastointitoteutus on tekstidatan varastoija, jonka rivinrajoitin on
‘Ja’ ’oletusarvoisena kentän erottimena (joka voidaan ohittaa välittämällä eri kenttäerottelija konstruktorissa) - tämä on samanlainen kuin nykyinen PigStorage-säilö Pigissä. Toteutus käyttää olemassa olevaa Hadoop-tuettua OutputFormat - TextOutputFormat -ohjelmaa taustalla olevana OutputFormat-tiedostona.
public class SimpleTextStorer laajentaa StoreFunc {suojattu RecordWriter-kirjoittaja = null yksityinen tavu fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (String delimiter) {this ( ) if (erotin.pituus () == 1) {this.fieldDel = (tavu) delimiter.charAt (0)} muu delimiter.charAt (1)) {tapaus 't': this.fieldDel = (tavu) '' taukotapa 'x': fieldDel = Kokonaisluku.arvoOf (erotin.substring (2), 16) .byteValue () taukotapa ' u ': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: heittää uusi RuntimeException (' Tuntematon erotin '+ erotin)}} else {heitä uusi RuntimeException (' PigStorage-erottimen on oltava yksi merkki ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) heittää IOException {int sz = f.size () for (int i = 0 iOnko sinulla kysymys meille? Mainitse ne kommenttiosassa ja palaamme sinuun.
Aiheeseen liittyvät julkaisut: