如何用猪中的空值过滤记录



我正在尝试放下任何字段中至少包含一个空的记录。例如,如果数据有3个字段,则:

filtered = FILTER data by ($0 is not null) AND ($1 is not null) AND ($2 is not null)

有没有更干净的方法来执行此操作,而不必写3个布尔表达式?

如果所有字段都是数字类型,则可以简单地做

之类的事情
filtered = FILTER data BY $0*$1*$2 is not null;

在猪中,如果算术表达中的任何术语为null,则结果为无效。

您还可以编写一个UDF进行任意数量的参数并返回null(或0或FALSE,您发现最方便的情况),如果有任何参数为null。

filtered = FILTER data BY NUMBER_OF_NULLS($0, $1, $2) == 0;

其中在其他地方定义了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;
    }
}

注意:我尚未测试上述UDF,也没有声称它遵守任何最佳做法,以编写清晰,强大的UDF。您应该添加异常处理代码。

我认为有一种更好的方法可以在不使用udf的情况下,即使用pig中的拆分。

emp = load '/Batch1/pig/emp' using PigStorage(',') as (id:chararray, name:chararray, salary:int, dept:chararray);
SPLIT emp INTO emptyDept IF depart == '', nonemptyDept IF depart != '';
DUMP nonemptyDept;

由此产生的关系nonemptyDept将显示EMP关系的所有非空置部门值。

最新更新