Hive 在使用 case 语句和聚合时按列分组时出错



我正在处理蜂巢中的查询。在这方面,我正在使用聚合,例如总和和案例语句以及按子句分组。我已经更改了列名和表名,但我的逻辑与我在项目中使用的逻辑相同

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when tot_sal > 1000 then exp(tot_hike)
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

对于上述查询,我收到错误为"表达式不在键'1000'组中"。 所以我稍微修改了查询并重试我的另一个查询是

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when sum(empsal) > 1000 then exp(sum(emphike))
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

对于上面的查询,它把我的错误放在"表达式不在按键'经理'组中"。 当我通过显示无效别名在组中添加经理时。 请在这里帮助我

我在您的查询中看到三个问题:

1.( Hive 无法按您在选择块中定义的变量按您立即为其指定的名称进行分组。您可能需要一个子查询。

2.( 当sumcount操作不在查询结束时时,Hive 往往会显示错误。

3.(虽然我不知道你的目标是什么,但我认为你的查询不会提供预期的结果。如果按empsal分组,则设计上empsalsum(empsal)之间没有区别。emphikesum(emphike)也是如此。

我认为以下查询可能会解决这些问题:

select
a.empname,
a.tot_sal, 
a.tot_hike,
if(a.tot_sal > 1000, exp(a.tot_hike), 0) as manager
from
(select 
empname,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
from employee
group by 
empname
)a

if语句等同于您的case语句,但是我发现它更容易阅读。

在此示例中,您无需在子查询之后分组,因为分组是在子查询a中完成的。

最新更新