2013-08-06 108 views
4

我試圖計算一個數據集的多少值符合篩選條件我不能指望,但我運行到問題時,過濾器沒有條目相匹配。豬過濾器返回的空袋子,

有我data結構有很多欄目,但只有三個用在這個例子中:key - 爲組(不是唯一的),value數據的關鍵 - 作爲記錄浮點值,nominal_value - 浮代表標稱值。

,現在我們使用的情況下是要找到低於標稱值10%以上的值的數目。

我在做這樣的事情:

filtered_data = FILTER data BY value <= (0.9 * nominal_value); 
filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE COUNT(filtered_data.value); 
DUMP filtered_count; 

在大多數情況下,沒有落在標稱範圍以外的值,所以filtered_data爲空(或空不知道如何判斷。 )。這導致filtered_count也爲空/空,這是不可取的。

我怎樣才能構建將返回值爲0時filtered_data空/空的聲明?我試了幾個選項,我已經在網上找到:

-- Extra parens in COUNT required to avoid syntax error 
filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE COUNT((filtered_data.value is null ? {} : filtered_data.value)); 

導致:

Two inputs of BinCond must have compatible schemas. left hand side: #1259:bag{} right hand side: #1261:bag{#1260:tuple(cf#1038:float)} 

和:

filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE (filtered_data.value is null ? 0 : COUNT(filtered_data.value)); 

這導致空/空結果。

回答

3

您有它設置了,現在,你將失去任何鍵,其錯誤值的計數爲0。相反的信息,我建議你保留所有的鍵,這樣就可以看到積極的確認的方式計數爲0,而不是通過不存在推斷它。要做到這一點,只需使用一個指標,然後SUM是:

data2 = 
    FOREACH data 
    GENERATE 
     key, 
     ((value <= 0.9*nominal_value) ? 1 : 0) AS bad; 
bad_count = FOREACH (GROUP data2 BY key) GENERATE group, SUM(data2.bad);