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为空(或 null。不知道如何分辨。)。这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));

这导致空/空结果。

4

1 回答 1

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);
于 2013-08-07T13:56:37.410 回答