hadoop - 在 EvalFunc pig UDF 中抛出异常是跳过那一行,还是完全停止?

标签 hadoop apache-pig

我有一个用 Java 编写的用户定义函数 (UDF),用于解析日志文件中的行并将信息返回给 pig,因此它可以完成所有处理。

看起来像这样:

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,它会完全停止,还是会为其余未抛出异常的行返回结果?

例子:我在 pig 身上运行这个

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"

它会处理这两行并且“logs”会有 2 个元组,还是会在火中烧毁?

最佳答案

如果 UDF 抛出异常,任务将失败并重试。

它将再次失败三次(默认尝试 4 次),整个作业将失败。

如果您想记录错误并且不想让作业停止,您可以返回一个空值:

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

然后在 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);

在您的示例中,输出将只有两行有效(但要小心这种行为,因为错误仅出现在日志中,不会使您的工作失败!)。

回复评论#1:

实际上,整个结果元组将为空(因此内部没有字段)。

例如,如果您的模式有 3 个字段:

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

有些行不正确我们会得到:

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

如果您不过滤空行并尝试访问一个字段,您将得到一个 java.lang.NullPointerException:

events = FOREACH events_all GENERATE line.a;

关于hadoop - 在 EvalFunc pig UDF 中抛出异常是跳过那一行,还是完全停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2540071/

相关文章:

hadoop - 可以在Foreach Generate语句中使用 'NOT'吗?

hadoop - 根据APACHE PIG中的条件加载数据

hadoop - reducer 可以写入两个不同的文件吗?

Hadoop 在另一个文件中搜索一个文件中的单词

hadoop - Pig拆分组合功能是否可以与TextLoader一起使用?

hadoop - 如何验证从RDB到Hadoop HDFS的数据

hadoop - Pig Latin(在 foreach 循环中过滤第二个数据源)

maven - 运行hbase java程序出错

ubuntu - 无法启动 hive 提示

hadoop - 触发 Hadoop 上的 map 缩减作业并在完成时发送电子邮件的 UI 仪表板