我正在尝试删除任何字段中至少包含一个null的记录。例如,如果数据有3个字段,则:
filtered = FILTER data by ($0 is not null) AND ($1 is not null) AND ($2 is not null)
有没有更简洁的方法来做到这一点,而不必写出3个布尔表达式?
答案 0 :(得分:8)
如果所有字段都是数字类型,您可以简单地执行类似
的操作filtered = FILTER data BY $0*$1*$2 is not null;
在Pig中,如果算术表达式中的任何术语为null,则结果为null。
如果任何参数为null,您也可以编写一个UDF来获取任意数量的参数并返回null(或0或false,无论您认为哪种方式最方便)。
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的任何最佳实践。例如,您应该添加异常处理代码。
答案 1 :(得分:0)
我当时想有一种更好的方法,而不使用UDF,即在Pig中使用SPLIT。
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关系的所有非空部门值。