我正在尝试计算数据集中有多少值与过滤条件匹配,但是当过滤器没有条目匹配时,我遇到了问题。
我的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结果。
答案 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);