Est-ce que jeter une exception dans un porc EvalFunc UDF juste sauter cette ligne, ou arrêter complètement?

StackOverflow https://stackoverflow.com/questions/2540071

  •  23-09-2019
  •  | 
  •  

Question

J'ai un utilisateur fonction définie (UDF) écrit en Java pour analyser les lignes dans un fichier journal et retourner informations à cochon, il peut faire tout le traitement.

Il ressemble à ceci:

public abstract class Foo extends EvalFunc<Tuple> {
    public Foo() {
        super();
    }

    public Tuple exec(Tuple input) throws IOException {
        try {
            // do stuff with input
        } catch (Exception e) {
            throw WrappedIOException.wrap("Error with line", e);
        }
    }
}

Ma question est: si elle jette le IOException, il va arrêter complètement, ou le renverra des résultats pour le reste des lignes qui ne jette pas une exception

Exemple: Je lance ce cochon dans

REGISTER myjar.jar
DEFINE Extractor com.namespace.Extractor();

logs = LOAD '$IN' USING TextLoader AS (line: chararray);
events = FOREACH logs GENERATE FLATTEN(Extractor(line));

Avec cette entrée:

1.5 7 "Valid Line"
1.3 gghyhtt Inv"alid line"" I throw an exceptioN!!
1.8 10 "Valid Line 2"

Sera-t-traiter les deux lignes et seront « logs » ont 2 tuples, ou vont mourir juste un feu?

Était-ce utile?

La solution

Si l'exception est levée par l'UDF la tâche échouera et sera rejugé.

Il échouera à nouveau trois fois (4 tentatives par défaut) et l'ensemble du travail sera ECHEC.

Si vous voulez enregistrer l'erreur et ne veulent pas avoir le travail que vous pouvez retourner un arrêté de null:

public Tuple exec(Tuple input) throws IOException {
    try {
        // do stuff with input
    } catch (Exception e) {
        System.err.println("Error with ...");
        return null;
    }
}

Et les filtrer plus tard dans Pig:

events_all = FOREACH logs GENERATE Extractor(line) AS line;
events_valid = FILTER events_all by line IS NOT null;
events = FOREACH events_valid GENERATE FLATTEN(line);

Dans votre exemple, la sortie n'ont les deux lignes valides (mais attention à ce comportement que l'erreur est présente seulement dans les journaux et ne manquera pas votre travail!).

Répondre au commentaire # 1:

En fait, l'ensemble uplet résultant serait nul (donc il n'y a pas de champs à l'intérieur).

Par exemple, si votre schéma a 3 champs:

 events_all = FOREACH logs
              GENERATE Extractor(line) AS line:tuple(a:int,b:int,c:int);

et certaines lignes sont incorrectes, nous obtenons:

 ()
 ((1,2,3))
 ((1,2,3))
 ()
 ((1,2,3))

Et si vous ne filtrent pas la ligne nulle et essayez d'accéder à un champ que vous obtenez une java.lang.NullPointerException :

events = FOREACH events_all GENERATE line.a;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top