Apache Pig UDF: Teil 2 - Ladefunktionen

Dieser Beitrag beschreibt Apache Pig UDF - Ladefunktionen. (Apache Pig UDF: Teil 2). Schauen Sie sich die Ladefunktionen von Apache Pig UDF an.

Der heutige Beitrag befasst sich mit den Ladefunktionen in Apache Pig. Dies ist die Fortsetzung des erster Beitrag die UDF-Funktionen wie Eval, Filter und Aggregate abdeckten. Bitte wenden Sie sich an sie, um weitere Informationen zu anderen Funktionen von Pig UDF zu erhalten.



Die Ladefunktion von Pig basiert auf dem InputFormat eines Hadoop, der Klasse, mit der Hadoop Daten liest. InputFormat dient zwei Zwecken: Es bestimmt, wie Eingaben zwischen Kartenaufgaben fragmentiert werden, und stellt einen RecordReader bereit, der zu Schlüssel-Wert-Paaren als Eingabe für diese Kartenaufgaben führt. Die Basisklasse für die Ladefunktion ist LoadFunc.

Was ist Swing in Java

Ladefunktion - Klassifizierung:

Die abstrakte Klasse LoadFunc verfügt über drei Hauptmethoden zum Laden von Daten. In den meisten Anwendungsfällen würde es ausreichen, sie zu erweitern. Es gibt drei weitere optionale Schnittstellen, die implementiert werden können, um erweiterte Funktionen zu erreichen:

  • LoadMetadata:

LoadMetadata verfügt über Methoden zum Umgang mit Metadaten. Die meisten Loader müssen erst implementiert werden, wenn sie mit einem Metadatensystem interagieren. Die Methode getSchema () in dieser Schnittstelle bietet den Loader-Implementierungen eine Möglichkeit, über das Schema der Daten an Pig zurück zu kommunizieren. Wenn eine Loader-Implementierung Daten zurückgibt, die aus Feldern realer Typen bestehen, sollte sie das Schema bereitstellen, das die über die Methode getSchema () zurückgegebenen Daten beschreibt. Die anderen Methoden befassen sich mit anderen Arten von Metadaten wie Partitionsschlüsseln und Statistiken. Implementierungen können für diese Methoden Null-Rückgabewerte zurückgeben, wenn sie für die andere Implementierung nicht gültig sind.

  • LoadPushDown:

LoadPushDown verfügt über verschiedene Methoden, um Vorgänge von der Pig-Laufzeit in Loader-Implementierungen zu übertragen. Derzeit wird von Pig nur die pushProjection () -Methode aufgerufen, um dem Loader die genauen Felder mitzuteilen, die im Pig-Skript erforderlich sind. Die Loader-Implementierung kann wählen, ob die Anforderung eingehalten werden soll oder nicht. Wenn die Loader-Implementierung beschließt, die Anforderung einzuhalten, sollte sie LoadPushDown implementieren, um die Abfrageleistung zu verbessern.

  • pushProjection ():

Diese Methode informiert LoadFunc darüber, welche Felder im Pig-Skript erforderlich sind. Auf diese Weise kann LoadFunc die Leistung verbessern, indem nur die erforderlichen Felder geladen werden. pushProjection () verwendet eine 'requiredFieldList'. 'requiredFieldList' ist schreibgeschützt und kann von LoadFunc nicht geändert werden. 'RequiredFieldList' enthält eine Liste von 'requiredField', wobei jedes 'requiredField' ein Feld angibt, das vom Pig-Skript benötigt wird und aus Index, Alias, Typ und Unterfeldern besteht. Pig verwendet den Spaltenindex requiredField.index, um mit LoadFunc über die vom Pig-Skript benötigten Felder zu kommunizieren. Wenn das erforderliche Feld eine Karte ist, übergibt Pig 'requiredField.subFields', das eine Liste der Schlüssel enthält, die für Pig-Skripte für die Karte erforderlich sind.

String Split mehrere Trennzeichen Java
  • LoadCaster:

LoadCaster verfügt über Techniken zum Konvertieren von Byte-Arrays in bestimmte Typen. Eine Loader-Implementierung sollte dies implementieren, wenn implizite oder explizite Umwandlungen von DataByteArray-Feldern in andere Typen unterstützt werden müssen.

Die abstrakte LoadFunc-Klasse ist die Hauptklasse, die für die Implementierung eines Loaders erweitert werden muss. Die Methoden, die überschrieben werden müssen, werden nachfolgend erläutert:

  • getInputFormat ():

    Diese Methode wird von Pig aufgerufen, um das vom Loader verwendete InputFormat abzurufen. Die Methoden im InputFormat werden von Pig auf dieselbe Weise wie Hadoop in einem MapReduce-Java-Programm aufgerufen. Wenn es sich bei dem InputFormat um ein Hadoop-Paket handelt, sollte die Implementierung die neue API-basierte Version unter org.apache.hadoop.mapreduce verwenden. Wenn es sich um ein benutzerdefiniertes InputFormat handelt, ist es besser, es mithilfe der neuen API in org.apache.hadoop.mapreduce zu implementieren.

  • Ort festlegen():

    Diese Methode wird von Pig aufgerufen, um dem Lader den Ladeort mitzuteilen. Der Loader muss diese Methode verwenden, um die gleichen Informationen an das Kern-InputFormat zu übermitteln. Diese Methode wird vom Schwein mehrfach aufgerufen.

  • prepareToRead ():

    Bei dieser Methode wird der RecordReader, der sich auf das von LoadFunc bereitgestellte InputFormat bezieht, an LoadFunc übergeben. Der RecordReader kann jetzt von der Implementierung in getNext () verwendet werden, um ein Tupel, das einen Datensatz von Daten darstellt, an Pig zurückzugeben.

  • getNext ():

    Die Bedeutung von getNext () hat sich nicht geändert und wird von Pig Runtime aufgerufen, um das nächste Tupel in den Daten abzurufen. Bei dieser Methode sollte die Implementierung den zugrunde liegenden RecordReader verwenden und das zurückzugebende Tupel erstellen.

Standardimplementierungen in LoadFunc:

Beachten Sie, dass die Standardimplementierungen in LoadFunc nur bei Bedarf überschrieben werden sollten.

  • setUdfContextSignature ():

    Diese Methode wird von Pig sowohl im Front-End als auch im Back-End aufgerufen, um dem Loader eine eindeutige Signatur zu übergeben. Die Signatur kann verwendet werden, um alle Informationen im UDFContext zu speichern, die der Loader zwischen verschiedenen Methodenaufrufen im Front-End und Back-End speichern muss. Ein Anwendungsfall besteht darin, die an LoadPushDown.pushProjection (RequiredFieldList) übergebene RequiredFieldList zur Verwendung im Back-End zu speichern, bevor Tupel in getNext () zurückgegeben werden. Die Standardimplementierung in LoadFunc hat einen leeren Text. Diese Methode wird vor anderen Methoden aufgerufen.

  • relativeToAbsolutePath ():

    Pig Runtime ruft diese Methode auf, damit der Loader einen relativen Ladeort in einen absoluten Ort konvertieren kann. Die in LoadFunc bereitgestellte Standardimplementierung behandelt dies für Dateisystemspeicherorte. Wenn die Ladequelle etwas anderes ist, kann die Loader-Implementierung dies überschreiben.

Die Loader-Implementierung im Beispiel ist ein Loader für Textdaten mit dem Zeilenbegrenzer '
'Und' als Standardfeldtrennzeichen ähnlich dem aktuellen PigStorage-Loader in Pig. Die Implementierung verwendet ein vorhandenes von Hadoop unterstütztes Eingabeformat - TextInputFormat - als zugrunde liegendes InputFormat.

public class SimpleTextLoader erweitert LoadFunc {protected RecordReader in = null privates Byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} ** Pig Loader, der das angegebene Zeichen als Feldtrennzeichen verwendet. * * @param delimiter * das Einzelbytezeichen, mit dem Felder getrennt werden. * ('' ist die Standardeinstellung.) * / public SimpleTextLoader (String-Trennzeichen) {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 ('Unbekannter Begrenzer' + Begrenzer)}} else {neue RuntimeException auslösen ('PigStorage-Begrenzer muss ein einzelnes Zeichen sein')}} @Override public Tuple getNext () löst IOException aus {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 für (int i = 0 iHast du eine Frage an uns? Bitte erwähnen Sie es in den Kommentaren und wir werden uns bei Ihnen melden. 

Zusammenhängende Posts:

Implementierung einer verknüpften Liste in c