いずれかのフィールドに少なくとも 1 つの null を含むレコードを削除しようとしています。たとえば、データに 3 つのフィールドがある場合、次のようになります。
filtered = FILTER data by ($0 is not null) AND ($1 is not null) AND ($2 is not null)
3つのブール式を書き出さなくても、これを行うためのよりクリーンな方法はありますか?
いずれかのフィールドに少なくとも 1 つの null を含むレコードを削除しようとしています。たとえば、データに 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;
Pig では、算術式のいずれかの項が null の場合、結果は null になります。
また、任意の数の引数を取り、いずれかの引数が null の場合に null (または 0、または false など、最も便利な方法) を返す UDF を作成することもできます。
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 を作成するためのベスト プラクティスに準拠しているとは言えません。たとえば、例外処理コードを追加する必要があります。