如何在PIG中过滤空值的记录?

CJL*_*Lam 2 apache-pig

我试图删除任何字段中至少包含一个null的记录.例如,如果数据有3个字段,则:

filtered = FILTER data by ($0 is not null) AND ($1 is not null) AND ($2 is not null)
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来做到这一点,而不必写出3个布尔表达式?

reo*_*toa 8

如果所有字段都是数字类型,您可以简单地执行类似的操作

filtered = FILTER data BY $0*$1*$2 is not null;
Run Code Online (Sandbox Code Playgroud)

在Pig中,如果算术表达式中的任何项为null,则结果为null.

你也可以编写一个UDF来获取任意数量的参数并返回null(如果任何参数为null,则返回0或false,无论你认为哪种方便).

filtered = FILTER data BY NUMBER_OF_NULLS($0, $1, $2) == 0;
Run Code Online (Sandbox Code Playgroud)

其他位置定义了NUMBER_OF_NULLS个,例如

public class NUMBER_OF_NULLS extends EvalFunc {
    public Integer exec(Tuple input) {
        if (input == null) { return 0; }

        int c = 0;
        for (int i = 0; i < input.size(); i++) {
            if (input.get(i) == null) c++;
        }
        return c;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我没有测试过上面的UDF,我并不认为它遵循编写清晰,强大的UDF的任何最佳实践.例如,您应该添加异常处理代码.