Apache Pig UDF: Part 3 - Store-functies



Dit bericht beschrijft Apache Pig UDF - Store-functies. (Apache Pig UDF: deel 3). Bekijk de Store-functies van Apache Pig UDF.

StoreFunc abstracte klasse heeft de belangrijkste methoden voor het opslaan van gegevens en in de meeste gevallen zou het voldoende moeten zijn om deze uit te breiden. Er is een optionele interface die kan worden geïmplementeerd om uitgebreide functionaliteit te bereiken:





StoreMetadata

Deze interface heeft methoden voor interactie met metadatasystemen om schema's en statistieken op te slaan. Deze interface is optioneel en mag alleen worden geïmplementeerd als metadata moet worden opgeslagen.

De methoden die moeten worden overschreven in StoreFunc worden hieronder uitgelegd:



  • getOutputFormat ():

    Deze methode wordt door Pig aangeroepen om het OutputFormat op te halen dat door de Storer wordt gebruikt. De methoden in het OutputFormat zullen door Pig op dezelfde manier en in dezelfde context worden aangeroepen als door Hadoop in een Java-programma voor het verkleinen van kaarten. Als het OutputFormat een Hadoop-pakket is, moet de implementatie de nieuwe API-gebaseerde gebruiken onder org.apache.hadoop.mapreduce. Als het een aangepast OutputFormat is, moet het worden geïmplementeerd met behulp van de nieuwe API onder org.apache.hadoop.mapreduce. De methode checkOutputSpecs () van de OutputFormat wordt aangeroepen door pig om de uitvoerlocatie van tevoren te controleren. Deze methode wordt ook aangeroepen als onderdeel van de Hadoop-aanroepreeks wanneer de taak wordt gestart. Implementaties moeten er dus voor zorgen dat deze methode meerdere keren kan worden aangeroepen zonder inconsistente bijwerkingen.

  • setStoreLocation ():

    Deze methode wordt door Pig aangeroepen om de winkellocatie aan de opslager te communiceren. De opslaghouder moet deze methode gebruiken om dezelfde informatie door te geven aan het onderliggende OutputFormat. Deze methode wordt meerdere keren aangeroepen door Pig. Implementaties moeten er rekening mee houden dat deze methode meerdere keren wordt aangeroepen en ervoor moet zorgen dat er geen inconsistente bijwerkingen zijn vanwege de meerdere aanroepen.

  • preparToWrite ():

    In de nieuwe API worden de gegevens weggeschreven via het OutputFormat van StoreFunc. In preparToWrite () wordt de RecordWriter die is gekoppeld aan het OutputFormat geleverd door de StoreFunc doorgegeven aan de StoreFunc. De RecordWriter kan vervolgens worden gebruikt door de implementatie in putNext () om een ​​tuple te schrijven die een record met gegevens vertegenwoordigt op een manier die wordt verwacht door de RecordWriter.

  • putNext ():

    De betekenis van putNext () is niet veranderd en wordt door Pig runtime aangeroepen om de volgende tuple met gegevens te schrijven - in de nieuwe API is dit de methode waarbij de implementatie de onderliggende RecordWriter zal gebruiken om de Tuple weg te schrijven.

Standaardimplementaties in StoreFunc:

  • setStoreFuncUDFContextSignature ():

    Deze methode wordt zowel aan de voorkant als aan de achterkant door Pig aangeroepen om een ​​unieke handtekening door te geven aan de Storer. De handtekening kan worden gebruikt om alle informatie in de UDFC-context op te slaan die de Storer moet opslaan tussen verschillende methode-aanroepen in de front-end en back-end. De standaardimplementatie in StoreFunc heeft een lege body. Deze methode wordt eerder aangeroepen dan andere methoden.

  • relToAbsPathForStoreLocation ():

    Pig runtime roept deze methode aan om de Storer in staat te stellen een relatieve winkellocatie naar een absolute locatie te converteren. Een implementatie is voorzien in StoreFunc die dit afhandelt voor op FileSystem gebaseerde locaties.

  • checkSchema ():

    Een Store-functie moet deze functie implementeren om te controleren of een bepaald schema dat de te schrijven gegevens beschrijft, voor hem acceptabel is. De standaardimplementatie in StoreFunc heeft een lege body. Deze methode wordt aangeroepen voordat setStoreLocation () wordt aangeroepen.

Voorbeeld implementatie:

De opslagimplementatie in het voorbeeld is een opslagplaats voor tekstgegevens met een lijnscheidingsteken als ‘
‘En‘ als standaard veldscheidingsteken (die kan worden overschreven door een ander veldscheidingsteken in de constructor door te geven) - dit is vergelijkbaar met de huidige PigStorage-opslag in Pig. De implementatie maakt gebruik van een bestaand door Hadoop ondersteund OutputFormat - TextOutputFormat als het onderliggende OutputFormat.

public class SimpleTextStorer breidt StoreFunc {protected RecordWriter writer = null private byte fieldDel = '' private static final int BUFFER_SIZE = 1024 private static final String UTF8 = 'UTF-8' public PigStorage () {} public PigStorage (String scheidingsteken) {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 () break case ' u ': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: throw new RuntimeException (' Unknown delimiter '+ delimiter)}} else {throw new RuntimeException (' PigStorage delimeter moet een single character ')}} ByteArrayOutputStream mOut = nieuwe ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) gooit IOException {int sz = f.size () voor (int i = 0 i

Heeft u een vraag voor ons? Vermeld ze in het opmerkingengedeelte en we nemen contact met u op.

Gerelateerde berichten:



Apache Pig UDF: deel 2
Apache Pig UDF: deel 1