apache-pig - 如何在 PIG 中过滤具有空值的记录?

标签 apache-pig

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

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

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

最佳答案

如果所有的字段都是数字类型,你可以简单地做类似的事情

filtered = FILTER data BY $0*$1*$2 is not null;

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

您还可以编写一个 UDF 来接受任意数量的参数并在任何参数为 null 时返回 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 的最佳实践。例如,您应该添加异常处理代码。

关于apache-pig - 如何在 PIG 中过滤具有空值的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12959001/

相关文章:

user-defined-functions - 错误 1066 : Unable to open iterator for alias in pig

hadoop - PigLatin问题

hadoop - 使用来自 grunt 的 exec 命令运行脚本

hadoop - 将 50 个大文件中的列/字段合并到一个文件中

hadoop - PigStorage如何在Hadoop中使用,为什么?

java - pig - 我得到 "Error: Java heap space"和数十万元组

hadoop - 在 Pig 的 Parquet 上使用 hive 表

java - 我收到的错误检查Apache Pig版本 “Error: Could not find or load main class C:\java\lib\tools.jar”

hadoop - 如何在 pig 中实现 Union All?