2012-10-18 36 views
2

我想刪除任何字段中至少包含一個空值的記錄。例如,如果數據有3個字段,那麼:如何在PIG中過濾空值的記錄?

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

有沒有更乾淨的方法來做到這一點,而不必寫出3個布爾表達式?

回答

8

如果所有的字段都是數字類型的,你可以簡單地做這樣的事情

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

豬,如果在算術表達式中的任何條款都爲空,則結果爲空。

你也可以編寫一個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。例如,您應該添加異常處理代碼。