我试图计算数据集中有多少值与筛选条件相匹配,但当筛选器不匹配项时,我会遇到问题。
在我的data
结构中有很多列,但是在这个示例中只有三种用法:key
--用于集合的数据键(并不是唯一的),value
--记录的浮点数,nominal_value
-浮点,表示名义值。
我们现在的用例是查找低于标称值10%或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));
结果为空/空结果。
发布于 2013-08-07 05:56:37
按照现在设置它的方式,您将丢失有关错误值计数为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);
https://stackoverflow.com/questions/18086768
复制