Pig FILTER返回空包,我无法计算

时间:2013-08-06 17:33:37

标签: apache-pig

我正在尝试计算数据集中有多少值与过滤条件匹配,但是当过滤器没有条目匹配时,我遇到了问题。

我的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也为空/空,这是不可取的。

filtered_data为空/空时,如何构造一个返回值为0的语句?我尝试了一些我在网上找到的选项:

-- 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));

导致空/ null结果。

1 个答案:

答案 0 :(得分: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);