hive agg要求分组中的列

时间:2016-04-12 20:34:13

标签: hadoop group-by hive case

我有一个基本的查询(用模糊名称重写),我不明白为什么hive要求将case语句中的t2.description列添加到组中。我安抚了它们并把它放进去但当然我为每一行的那个列得到了空值...如果我拿出case语句并查询原始数据我会得到所有可爱的描述。只有当我想用case语句添加一些逻辑时才会失败。我是Hive的新手,并且明白它不是ANSI sql,但我没想到它是这个挑剔。

select
t1.columnid               as column_id,
(case when t2.description in ('description1','description2','description3') then t2.description else null end) as label_description

from table1 t1
left outer join table2 t2 on (t1.inresult = t2.inresult)

group by
t1.columnid

1 个答案:

答案 0 :(得分:0)

基于Hive的sql解析器显示的错误日志,通常很难理解实际问题。这里的问题是您选择了2列,但只将GROUP BY应用于一列。要使此查询可执行,您必须执行以下操作之一:

  1. 第1列和第2列分组
  2.   

    选择t1.columnid为column_id,       (当''description1','description2','description3')中的t2.description然后t2.description时的情况   else null end)作为table1的label_description t1左外连接   table2 t2 on(t1.inresult = t2.inresult)GROUP BY t1.columnid,(case   当t2.description('description1','description2','description3')时   然后t2.description else null end);

    1. 不要使用GROUP BY语句
    2.   

      选择t1.columnid为column_id,       (当''description1','description2','description3')中的t2.description然后t2.description时的情况   else null end)作为table1的label_description t1左外连接   table2 t2 on(t1.inresult = t2.inresult)

      1. 将聚合函数应用于第2列
      2.   

        选择t1.columnid为column_id,       MIN(在''description1','description2','description3'中的t2.description的情况)然后t2.description   else null end)作为table1的label_description t1左外连接   table2 t2 on(t1.inresult = t2.inresult)group by t1.columnid

        对于配置单元,如果您使用的是GROUP BY,那么您选择的所有列必须位于GROUP BY语句中,或者包含在应用的聚合语句中,例如MAX,MIN或SUM。