2013-08-06 45 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);