Apache Pig UDF: Partie 2 - Fonctions de chargement



Cet article décrit Apache Pig UDF - Fonctions de chargement. (Apache Pig UDF: Partie 2). Jetez un œil aux fonctions de chargement d'Apache Pig UDF.

Le billet d’aujourd’hui concerne les fonctions de chargement d’Apache Pig. Ceci est la suite du premier poste qui couvrait les fonctions UDF telles que Eval, Filter et Aggregate. Veuillez vous y référer pour plus d'informations sur les autres fonctions de Pig UDF.





synchronisation des threads dans l'exemple java

La fonction de chargement de Pig est construite sur un InputFormat de Hadoop, la classe utilisée par Hadoop pour lire les données. InputFormat a deux objectifs: il détermine comment l'entrée sera fragmentée entre les tâches cartographiques et fournit un RecordReader qui se traduit par des paires clé-valeur en tant qu'entrée de ces tâches cartographiques. La classe de base de la fonction de chargement est LoadFunc.

Fonction de charge - Classification:

La classe abstraite LoadFunc a trois méthodes principales pour charger des données et dans la plupart des cas d'utilisation, il suffirait de l'étendre. Il existe trois autres interfaces optionnelles qui peuvent être implémentées pour obtenir des fonctionnalités étendues:



  • LoadMetadata:

LoadMetadata a des méthodes pour traiter les métadonnées. La plupart des exécutions de chargeurs n'ont pas besoin de l'implémenter à moins qu'ils n'interagissent avec un système de métadonnées. La méthode getSchema () de cette interface offre un moyen pour les implémentations du chargeur de communiquer sur le schéma des données à Pig. Si une implémentation de chargeur renvoie des données composées de champs de types réels, elle doit fournir le schéma décrivant les données renvoyées via la méthode getSchema (). Les autres méthodes traitent d'autres types de métadonnées comme les clés de partition et les statistiques. Les implémentations peuvent renvoyer des valeurs de retour nulles pour ces méthodes si elles ne sont pas valides pour l'autre implémentation.

  • LoadPushDown:

LoadPushDown a différentes méthodes pour pousser les opérations du runtime Pig vers les implémentations de chargeur. Actuellement, seule la méthode pushProjection () est appelée par Pig pour communiquer au chargeur, les champs exacts qui sont requis dans le script Pig. L'implémentation du chargeur peut choisir de respecter ou non la demande. Si l'implémentation du chargeur décide de respecter la demande, elle doit implémenter LoadPushDown pour améliorer les performances de la requête.

  • pushProjection ():

Cette méthode informe LoadFunc, quels champs sont requis dans le script Pig. Permettant ainsi à LoadFunc d'améliorer les performances en ne chargeant que les champs requis. pushProjection () prend un 'requiredFieldList'. 'requiredFieldList' est en lecture seule et ne peut pas être modifié par LoadFunc. «RequiredFieldList» comprend une liste de «requiredField», où chaque «requiredField» indique un champ requis par le script Pig et comprend un index, un alias, un type et des sous-champs. Pig utilise l'index de colonne requiredField.index pour communiquer avec LoadFunc à propos des champs requis par le script Pig. Si le champ requis est une carte, Pig transmettra 'requiredField.subFields' qui contient une liste de clés requises par les scripts Pig pour la carte.



plan de suivi et de contrôle du projet
  • LoadCaster:

LoadCaster a des techniques pour convertir des tableaux d'octets en types spécifiques. Une implémentation de chargeur doit l'implémenter lorsque des transtypages implicites ou explicites des champs DataByteArray vers d'autres types doivent être pris en charge.

La classe abstraite LoadFunc est la classe principale à étendre pour implémenter un chargeur. Les méthodes qui doivent être remplacées sont expliquées ci-dessous:

  • getInputFormat ():

    Cette méthode est appelée par Pig pour obtenir le InputFormat utilisé par le chargeur. Les méthodes de InputFormat sont appelées par Pig de la même manière que Hadoop dans un programme Java MapReduce. Si InputFormat est un package Hadoop, l'implémentation doit utiliser la nouvelle API basée sur org.apache.hadoop.mapreduce. S'il s'agit d'un InputFormat personnalisé, il est préférable d'être implémenté à l'aide de la nouvelle API dans org.apache.hadoop.mapreduce.

  • setLocation ():

    Cette méthode est appelée par Pig pour communiquer l'emplacement de chargement au chargeur. Le chargeur doit utiliser cette méthode pour communiquer les mêmes informations au InputFormat principal. Cette méthode est appelée plusieurs fois par le porc.

  • prepareToRead ():

    Dans cette méthode, le RecordReader lié à InputFormat fourni par LoadFunc est passé à LoadFunc. Le RecordReader peut maintenant être utilisé par l'implémentation dans getNext () pour renvoyer un tuple représentant un enregistrement de données à Pig.

  • getNext ():

    La signification de getNext () n'a pas changé et est appelée par le runtime Pig pour acquérir le tuple suivant dans les données. Dans cette méthode, l'implémentation doit utiliser le RecordReader sous-jacent et construire le tuple à renvoyer.

Implémentations par défaut dans LoadFunc:

Notez que les implémentations par défaut de LoadFunc ne doivent être remplacées qu'en cas de besoin.

  • setUdfContextSignature ():

    Cette méthode sera appelée par Pig, à la fois dans le front-end et le back-end pour transmettre une signature unique au Loader. La signature peut être utilisée pour stocker toutes les informations dans le UDFContext que le chargeur a besoin de stocker entre diverses invocations de méthode dans le front-end et le back-end. Un cas d'utilisation consiste à stocker RequiredFieldList qui lui est passé dans LoadPushDown.pushProjection (RequiredFieldList) pour une utilisation dans le back-end avant de renvoyer des tuples dans getNext (). L'implémentation par défaut dans LoadFunc a un corps vide. Cette méthode sera appelée avant les autres méthodes.

  • relativeToAbsolutePath ():

    Le moteur d'exécution Pig appellera cette méthode pour permettre au chargeur de convertir un emplacement de chargement relatif en un emplacement absolu. L'implémentation par défaut fournie dans LoadFunc gère cela pour les emplacements FileSystem. Si la source de charge est autre chose, l'implémentation du chargeur peut choisir de la remplacer.

L’implémentation du chargeur dans l’exemple est un chargeur de données texte avec un délimiteur de ligne comme ‘
'Et' 'comme délimiteur de champ par défaut similaire au chargeur PigStorage actuel dans Pig. L'implémentation utilise un Inputformat pris en charge par Hadoop - TextInputFormat - comme InputFormat sous-jacent.

binaire à décimal en java
public class SimpleTextLoader étend 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 () {} / ** * Construit un Chargeur Pig qui utilise le caractère spécifié comme délimiteur de champ. * * @param delimiter * le caractère à un octet utilisé pour séparer les champs. * ('' est la valeur par défaut.) * / 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 () throws 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 iVous avez une question pour nous? Veuillez le mentionner dans la section commentaires et nous vous recontacterons. 

Articles Similaires: