Apache Pig UDF: Parte 3 - Funzioni di archivio



Questo post descrive Apache Pig UDF - Funzioni di archivio. (UDF di Apache Pig: Parte 3). Dai un'occhiata alle funzioni di archivio di Apache Pig UDF.

La classe astratta StoreFunc ha i metodi principali per memorizzare i dati e per la maggior parte dei casi d'uso dovrebbe essere sufficiente estenderla. C'è un'interfaccia opzionale che può essere implementata per ottenere funzionalità estese:





StoreMetadata

Questa interfaccia dispone di metodi per interagire con i sistemi di metadati per archiviare schemi e statistiche. Questa interfaccia è facoltativa e deve essere implementata solo se è necessario archiviare i metadati.

I metodi che devono essere sovrascritti in StoreFunc sono spiegati di seguito:



  • getOutputFormat ():

    Questo metodo verrà chiamato da Pig per ottenere l'OutputFormat utilizzato dallo Storer. I metodi in OutputFormat verranno chiamati da Pig nello stesso modo e nello stesso contesto di Hadoop in un programma Java di riduzione della mappa. Se OutputFormat è un pacchetto Hadoop, l'implementazione dovrebbe utilizzare la nuova API basata su org.apache.hadoop.mapreduce. Se si tratta di un OutputFormat personalizzato, dovrebbe essere implementato utilizzando la nuova API in org.apache.hadoop.mapreduce. Il metodo checkOutputSpecs () di OutputFormat verrà chiamato da pig per controllare in anticipo la posizione di output. Questo metodo verrà chiamato anche come parte della sequenza di chiamate Hadoop all'avvio del lavoro. Quindi le implementazioni dovrebbero garantire che questo metodo possa essere richiamato più volte senza effetti collaterali incoerenti.

  • setStoreLocation ():

    Questo metodo viene chiamato da Pig per comunicare la posizione del negozio al responsabile del magazzino. L'archiviatore dovrebbe utilizzare questo metodo per comunicare le stesse informazioni all'OutputFormat sottostante. Questo metodo viene chiamato più volte da Pig. Le implementazioni dovrebbero tenere presente che questo metodo viene chiamato più volte e dovrebbero garantire che non vi siano effetti collaterali incoerenti dovuti alle chiamate multiple.

  • prepareToWrite ():

    Nella nuova API, la scrittura dei dati avviene tramite OutputFormat fornito da StoreFunc. In prepareToWrite () il RecordWriter associato all'OutputFormat fornito da StoreFunc viene passato a StoreFunc. Il RecordWriter può quindi essere utilizzato dall'implementazione in putNext () per scrivere una tupla che rappresenta un record di dati nel modo previsto dal RecordWriter.

  • putNext ():

    Il significato di putNext () non è cambiato e viene chiamato dal runtime di Pig per scrivere la successiva tupla di dati: nella nuova API, questo è il metodo in cui l'implementazione utilizzerà il RecordWriter sottostante per scrivere la tupla.

Implementazioni predefinite in StoreFunc:

  • setStoreFuncUDFContextSignature ():

    Questo metodo verrà chiamato da Pig sia nel front-end che nel back-end per passare una firma univoca allo Storer. La firma può essere utilizzata per memorizzare qualsiasi informazione in UDFContext che lo Storer deve memorizzare tra varie chiamate di metodi nel front-end e nel back-end. L'implementazione predefinita in StoreFunc ha un corpo vuoto. Questo metodo verrà chiamato prima di qualsiasi altro metodo.

  • relToAbsPathForStoreLocation ():

    Il runtime Pig chiamerà questo metodo per consentire allo Storer di convertire una posizione di archivio relativa in una posizione assoluta. Viene fornita un'implementazione in StoreFunc che gestisce questo per le posizioni basate su FileSystem.

  • checkSchema ():

    Una funzione Store dovrebbe implementare questa funzione per verificare che un dato schema che descrive i dati da scrivere sia accettabile per essa. L'implementazione predefinita in StoreFunc ha un corpo vuoto. Questo metodo verrà chiamato prima di qualsiasi chiamata a setStoreLocation ().

Esempio di implementazione:

L'implementazione dello strumento di archiviazione nell'esempio è un archivio di dati di testo con delimitatore di riga come '
'E' 'come delimitatore di campo predefinito (che può essere sovrascritto passando un diverso delimitatore di campo nel costruttore): è simile all'attuale archivio PigStorage in Pig. L'implementazione usa un OutputFormat esistente supportato da Hadoop - TextOutputFormat come OutputFormat sottostante.

public class SimpleTextStorer estende 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 delimiter) {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 must be a carattere singolo ')}} ByteArrayOutputStream mOut = new ByteArrayOutputStream (BUFFER_SIZE) @Override public void putNext (Tuple f) genera IOException {int sz = f.size () for (int i = 0 i

Hai domande per noi? Per favore menzionali nella sezione commenti e ti risponderemo.

come usare il pacchetto in java

Post correlati:



Apache Pig UDF: parte 2
Apache Pig UDF: parte 1