Apache Pig UDF: Parte 2 - Funzioni di caricamento



Questo post descrive Apache Pig UDF - Load Functions. (UDF di Apache Pig: Parte 2). Dai un'occhiata alle funzioni di caricamento dell'UDF di Apache Pig.

qual è l'uso della programmazione socket

Il post di oggi riguarda le funzioni di caricamento in Apache Pig. Questo è il sequel di primo post che copriva le funzioni UDF come Eval, Filter e Aggregate. Si prega di tornare a loro per ulteriori informazioni su altre funzioni di Pig UDF.





La funzione di caricamento di Pig si basa sull'InputFormat di Hadoop, la classe che Hadoop utilizza per leggere i dati. InputFormat ha due scopi: determina il modo in cui l'input verrà frammentato tra le attività della mappa e fornisce un RecordReader che si traduce in coppie chiave-valore come input per quelle attività della mappa. La classe di base per la funzione di caricamento è LoadFunc.

Funzione di carico - Classificazione:

La classe astratta LoadFunc ha tre metodi principali per il caricamento dei dati e nella maggior parte dei casi di utilizzo sarebbe sufficiente estenderla. Ci sono altre tre interfacce opzionali che possono essere implementate per ottenere funzionalità estese:



  • LoadMetadata:

LoadMetadata dispone di metodi per gestire i metadati. La maggior parte delle esecuzioni dei caricatori non ha bisogno di implementarlo a meno che non interagiscano con un sistema di metadati. Il metodo getSchema () in questa interfaccia offre alle implementazioni del caricatore un modo per comunicare lo schema dei dati a Pig. Se un'implementazione del programma di caricamento restituisce dati composti da campi di tipi reali, dovrebbe fornire lo schema che descrive i dati restituiti tramite il metodo getSchema (). Gli altri metodi trattano altri tipi di metadati come chiavi di partizione e statistiche. Le implementazioni possono restituire valori di ritorno null per questi metodi se non sono validi per l'altra implementazione.

  • LoadPushDown:

LoadPushDown ha metodi diversi per inviare operazioni dal runtime Pig alle implementazioni del caricatore. Attualmente, solo il metodo pushProjection () viene chiamato da Pig per comunicare al caricatore, i campi esatti richiesti nello script Pig. L'implementazione del caricatore può scegliere di accettare o meno la richiesta. Se l'implementazione del caricatore decide di rispettare la richiesta, dovrebbe implementare LoadPushDown per migliorare le prestazioni delle query.

  • pushProjection ():

Questo metodo informa LoadFunc, quali campi sono obbligatori nello script Pig. Abilitando così LoadFunc per migliorare le prestazioni caricando solo i campi richiesti. pushProjection () accetta 'requiredFieldList'. 'requiredFieldList' è di sola lettura e non può essere modificato da LoadFunc. 'RequiredFieldList' include un elenco di 'requiredField', dove ogni 'requiredField' indica un campo richiesto dallo script Pig ed è composto da indice, alias, tipo e sottocampi. Pig utilizza l'indice di colonna requiredField.index per comunicare con LoadFunc sui campi richiesti dallo script Pig. Se il campo richiesto è una mappa, Pig passerà 'requiredField.subFields' che contiene un elenco di chiavi richieste dagli script Pig per la mappa.



come usare i file in java
  • LoadCaster:

LoadCaster dispone di tecniche per convertire matrici di byte in tipi specifici. Un'implementazione del caricatore dovrebbe implementarlo quando è necessario supportare i cast impliciti o espliciti dai campi DataByteArray ad altri tipi.

La classe astratta LoadFunc è la classe principale da estendere per l'implementazione di un caricatore. I metodi che devono essere sovrascritti sono spiegati di seguito:

  • getInputFormat ():

    Questo metodo viene chiamato da Pig per ottenere InputFormat utilizzato dal caricatore. I metodi in InputFormat vengono chiamati da Pig allo stesso modo di Hadoop in un programma Java MapReduce. Se InputFormat è un pacchetto Hadoop, l'implementazione dovrebbe utilizzare il nuovo basato su API, in org.apache.hadoop.mapreduce. Se si tratta di un InputFormat personalizzato, è meglio implementarlo utilizzando la nuova API in org.apache.hadoop.mapreduce.

  • setLocation ():

    Questo metodo viene chiamato da Pig per comunicare la posizione di caricamento al caricatore. Il caricatore deve utilizzare questo metodo per comunicare le stesse informazioni al core InputFormat. Questo metodo viene chiamato più volte dal maiale.

  • prepareToRead ():

    In questo metodo, il RecordReader relativo all'InputFormat fornito da LoadFunc viene passato a LoadFunc. Il RecordReader può ora essere utilizzato dall'implementazione in getNext () per restituire a Pig una tupla che rappresenta un record di dati.

  • getNext ():

    Il significato di getNext () non è cambiato e viene chiamato dal runtime di Pig per acquisire la tupla successiva nei dati. In questo metodo, l'implementazione dovrebbe usare il RecordReader sottostante e costruire la tupla da restituire.

Implementazioni predefinite in LoadFunc:

Tieni presente che le implementazioni predefinite in LoadFunc dovrebbero essere sovrascritte solo quando necessario.

come diventare un ingegnere di intelligenza artificiale
  • setUdfContextSignature ():

    Questo metodo verrà chiamato da Pig, sia nel front-end che nel back-end per passare una firma univoca al Loader. La firma può essere utilizzata per memorizzare qualsiasi informazione nel contesto UDFC che il Loader deve memorizzare tra i vari richiami di metodi nel front-end e nel back-end. Un caso d'uso è memorizzare RequiredFieldList passato ad esso in LoadPushDown.pushProjection (RequiredFieldList) per l'uso nel back-end prima di restituire le tuple in getNext (). L'implementazione predefinita in LoadFunc ha un corpo vuoto. Questo metodo verrà chiamato prima di altri metodi.

  • relativeToAbsolutePath ():

    Il runtime Pig chiamerà questo metodo per consentire al Loader di convertire una posizione di carico relativa in una posizione assoluta. L'implementazione predefinita fornita in LoadFunc gestisce questo per le posizioni del FileSystem. Se l'origine del caricamento è qualcos'altro, l'implementazione del caricatore può scegliere di sovrascriverla.

L'implementazione del caricatore nell'esempio è un caricatore per dati di testo con delimitatore di riga come '
'E' 'come delimitatore di campo predefinito simile al caricatore PigStorage corrente in Pig. L'implementazione usa un Inputformat esistente supportato da Hadoop - TextInputFormat - come InputFormat sottostante.

public class SimpleTextLoader estende LoadFunc {protected RecordReader in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} / ** * Costruisce a Caricatore di maiale che utilizza il carattere specificato come delimitatore di campo. * * @param delimitatore * il carattere a byte singolo utilizzato per separare i campi. * ('' è il valore predefinito.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.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 single character')}} @Override public Tuple getNext () genera IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Text value = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iHai domande per noi? Per favore menzionalo nella sezione commenti e ti risponderemo. 

Post correlati: