Mam funkcji zdefiniowanej przez użytkownika (UDF) napisane w języku Java, aby analizować linie w pliku dziennika i zwracać informacje z powrotem do świni, aby mógł wykonać wszystkie przetwarzania.Czy rzucając wyjątek w UDF EvalFunc, pomiń tę linię lub całkowicie ją zatrzymaj?
Wygląda to mniej więcej tak:
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);
}
}
}
Moje pytanie brzmi: czy to rzuca IOException, będzie całkowicie zatrzymać lub zwróci wyniki dla pozostałych linii, które nie wyjątek ?
przykład: uruchomić to w świni
REGISTER myjar.jar
DEFINE Extractor com.namespace.Extractor();
logs = LOAD '$IN' USING TextLoader AS (line: chararray);
events = FOREACH logs GENERATE FLATTEN(Extractor(line));
Z tego wejścia:
1.5 7 "Valid Line"
1.3 gghyhtt Inv"alid line"" I throw an exceptioN!!
1.8 10 "Valid Line 2"
będzie przetwarzać dwa wiersze i 'dzienników mają 2 krotki, albo po prostu umrzeć ogień?
W moim przypadku , Definiuję również schemat w UDF, więc zwracając wartość zerową, wszystko w wynikowej krotce byłoby zerowe, prawda? –
Jak to filtrować? FILTER events BY a NIE JEST NULL, zakładając, że EvalFunc zawsze zwraca wartość null, jeśli nie może znaleźć "a"? –
Musisz filtrować nazwę pola zwróconego przez UDF. W naszym przypadku jego nazwa to "linia", a jej wartości mogą być "zerowe" lub "(1,2,3)". Wykonuje się "FILTER zdarzenia po linii IS NOT null", jak pokazano w pierwszym przykładzie Pig. Jeśli zwróciłeś krotkę z 3 pustymi polami, np. '(,,)' zamiast 'null' możesz zrobić swoje 'FILTER events BY line.a IS NOT NULL', ale jest to mniej proste. – Romain