我正在尝试计算数据集中有多少个值与过滤条件匹配,但当过滤器不匹配任何条目时,我遇到了问题。
我的专栏里有很多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
也为空/空,这是不可取的。
我怎样才能构造一个语句,在以下情况下返回 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)}
And:
filtered_count = FOREACH (GROUP filtered_data BY key) GENERATE (filtered_data.value is null ? 0 : COUNT(filtered_data.value));
这会导致空/空结果。
按照您现在的设置方式,您将丢失有关错误值计数为 0 的任何键的信息。相反,我建议保留所有键,以便您可以看到计数为 0 的肯定确认,而不是通过缺席来推断。为此,只需使用一个指标,然后SUM
that:
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)