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

Hive: More clean way to SELECT AS and GROUP BY

我试着这样写 Hive Sql

SELECT count(1), substr(date, 1, 4) as year
FROM ***
GROUP BY year

但是 Hive 无法识别别名 'year',它会抱怨: 失败:SemanticException [错误 10004]:行 1:79 无效 table 别名或列引用 '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 中有什么干净的方法可以做到这一点吗?有什么建议吗?

想到的一个解决方案是 GROUP BY 到外部查询:

SELECT count(*) , year FROM 
(
   SELECT substr(date, 1, 4) as year FORM ***
) inner
GROUP BY year

GL!

在Hive 0.11.0及以后的版本中,如果hive.groupby.orderby.position.alias设置为true(默认为false),则可以按位置指定列。 因此,在您的 .hql 中设置 set hive.groupby.orderby.position.alias=true;(或永久解决方案的 .hiverc)就可以解决问题,然后您可以为上面的示例键入 group by 2。 资料来源:hive language manual

指定分组依据中的位置将解决您的问题。即使在 SET hive.groupby.orderby.position.alias=false; 时,Group By 中的此位置编号也有效 (配置单元 0.12)

SELECT count(1), substr(date, 1, 4) as year  
FROM ***
GROUP BY 2;