Hive:SELECT AS和GROUP BY的更简洁方法

时间:2015-04-04 05:53:27

标签: hadoop hive hiveql

我尝试像那样编写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有没有干净的方法来做到这一点?有什么建议吗?

3 个答案:

答案 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!