Tôi có một hàm do người dùng định nghĩa (UDF) được viết bằng Java để phân tích cú pháp các dòng trong tệp nhật ký và trả về thông tin về lợn, vì vậy nó có thể thực hiện tất cả quá trình xử lý.Việc ném một ngoại lệ trong một UDF của EvalFunc có bỏ qua dòng đó hay dừng hoàn toàn không?
Nó trông giống như sau:
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);
}
}
}
Câu hỏi của tôi là: nếu nó ném IOException, nó sẽ ngừng hoàn toàn, hoặc nó sẽ trả về kết quả cho phần còn lại của các dòng mà không ném một ngoại lệ ?
Ví dụ: Tôi chạy này ở lợn
REGISTER myjar.jar
DEFINE Extractor com.namespace.Extractor();
logs = LOAD '$IN' USING TextLoader AS (line: chararray);
events = FOREACH logs GENERATE FLATTEN(Extractor(line));
Với đầu vào này:
1.5 7 "Valid Line"
1.3 gghyhtt Inv"alid line"" I throw an exceptioN!!
1.8 10 "Valid Line 2"
Nó sẽ xử lý hai dòng và 'log' sẽ có 2 bộ dữ liệu, hoặc sẽ nó chỉ chết trong Một đám cháy?
Trong trường hợp của tôi , Tôi cũng định nghĩa một lược đồ trong UDF, vì vậy bằng cách trả về null, mọi thứ trong tuple kết quả sẽ là null, đúng không? –
Làm cách nào để lọc? LỰA CHỌN LỌC CỦA một IS NOT NULL, giả sử EvalFunc luôn trả về null nếu nó không thể tìm ra 'a'? –
Bạn cần phải lọc tên của trường được trả về bởi UDF. Trong trường hợp của chúng tôi tên của nó là 'dòng' và giá trị của nó có thể là 'null' hoặc '(1,2,3)'. Vì vậy, bạn thực hiện 'FILTER events by line IS NOT null' như trong ví dụ Pig đầu tiên. Nếu bạn trả lại một bộ tuple có 3 trường rỗng, ví dụ: '(,,)' thay vì 'null', bạn có thể làm 'FILTER events BY line.a IS NOT NULL' nhưng nó ít đơn giản hơn. – Romain