假设我有以下数据
Hour status
12 pass
12 fail
13 fail
13 fail
13 pass
我需要计算结果如下
Hour passcount failcount TotalCount
12 1 1 2
13 1 2 3
我知道我可以通过使用2个单独的过滤器分割记录来实现这一点,其中一个用于'传递'一个失败的' ,将它们分开计算并加入它们(如下所示)
pass_data = FILTER data by (status matches 'pass') ;
pass_group = group pass_data by hour;
pass_count = foreach pass_group generate flatten(group), count($1) as pass_count ;
original_count = foreach (group data by hour ) generate flatten(group),count($1) as total_count ;
joined = join original_count by hour , pass_count by hour ;
但我不喜欢上述解决方案。主要是因为它的代码行很多,实际上除了'传递之外还有多种状态。并且'失败' 我正在寻找的是如下所示:
awesome_count= foreach (group data by hour ) generate flatten(group),count($1) as total_count , count($1.status=='pass'?0:1) as pass_count ;
以上不起作用主要是因为状态对我来说是一个包...但我测试了一些简单的字段,猪不喜欢它..抛出所有类型的错误。 我希望有一种更好的方法或语法可以利用吗?
答案 0 :(得分:2)
对于您的输入,您可以尝试嵌套的foreach语句,以下逻辑将帮助您。
{{1}}