У меня есть пользовательская функция (UDF), написанная на Java, для анализа строк в файле журнала и возврата информации обратно в свиньи, поэтому она может выполнять всю обработку.Выбрасывает ли исключение в UDF-свинге EvalFunc, пропустив эту линию или полностью остановившись?
Это выглядит примерно так:
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);
}
}
}
Мой вопрос: если он бросает IOException, будет ли он остановится полностью, или он будет возвращать результаты для остальных линий, которые не бросают исключение ?
Пример: я запускаю это в свинью
REGISTER myjar.jar
DEFINE Extractor com.namespace.Extractor();
logs = LOAD '$IN' USING TextLoader AS (line: chararray);
events = FOREACH logs GENERATE FLATTEN(Extractor(line));
С этим входом:
1.5 7 "Valid Line"
1.3 gghyhtt Inv"alid line"" I throw an exceptioN!!
1.8 10 "Valid Line 2"
Будет ли обрабатывать две строки и «журналы» имеют 2 кортежи, или это будет просто умереть огонь?
В моем случае , Я также определяю схему в UDF, поэтому, возвращая null, все в результирующем кортеже будет null, правильно? –
Как вы отфильтровываете это? События FILTER BY IS NOT NULL, если EvalFunc всегда возвращает null, если он не может определить «a»? –
Вам нужно отфильтровать имя поля, возвращаемого UDF. В нашем случае его имя - «строка», а его значения могут быть «null» или «(1,2,3)». Итак, вы делаете «FILTER events by line IS NOT NULL», как показано в первом примере Pig. Если вы возвращали кортеж с тремя полями нуля, например. '(,,)' вместо 'null' вы могли бы выполнять свои «FILTER events BY line.a IS NOT NULL», но это менее просто. – Romain