我尝试像那样编写Hive Sql
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year
但是Hive无法识别别名'year',它抱怨说: FAILED:SemanticException [错误10004]:行1:79无效的表别名或列引用'year'
一个解决方案(Hive: SELECT AS and GROUP BY)建议使用'GROUP BY substr(date,1,4)'。
有效! 但是在某些情况下我想要分组的值可能是从多行hive函数代码生成的,编写像
这样的代码非常难看SELECT count(1), func1(func2(..........................)) AS something
FROM ***
GROUP BY func1(func2(..........................))
Hive有没有干净的方法来做到这一点?有什么建议吗?
答案 0 :(得分:14)
在分组依据中指定位置将解决您的问题。即使在SET hive.groupby.orderby.position.alias = false; 时,Group By 中的此位置编号仍然有效。 (Hive 0.12)
SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY 2;
答案 1 :(得分:6)
在Hive 0.11.0及更高版本中,如果hive.groupby.orderby.position.alias设置为true(默认值为false),则可以按位置指定列。
因此,在.hql(或.hiverc中设置永久解决方案)中设置set hive.groupby.orderby.position.alias=true;
可以解决问题,然后您可以为上面的示例键入group by 2
。
资料来源:hive language manual
答案 2 :(得分:0)
我想到的一个解决方案是将GROUP BY
放到外部查询中:
SELECT count(*) , year FROM
(
SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year
GL!