2015-04-04 72 views
4

我尝试写蜂巢的Sql像蜂巢:更清洁的方式来如SELECT和GROUP BY

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

但是蜂房无法识别别名“年”,它抱怨说: 失败:SemanticException [错误10004]:行1:79无效的表别名或列参考“年”

一个解决方案(Hive: SELECT AS and GROUP BY)建议使用'GROUP BY substr(date,1,4)'。

它的工作原理! 然而,在某些情况下,通过可从蜂巢功能代码多行生成我想组的价值,这是非常丑陋的编写代码就像

SELECT count(1), func1(func2(..........................)) AS something 
FROM *** 
GROUP BY func1(func2(..........................)) 

是否有蜂巢任何干净的方式做到这一点?有什么建议么?浮现在脑海

回答

5

在Group By中指定位置将解决您的问题。即使在SET hive.groupby.orderby.position.alias = false时,分组依据中的位置编号也可以工作。 (Hive 0.12)

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

太棒了。我正在寻找这个 – Sanket 2016-09-22 06:34:00

0

一种解决方案是把GROUP BY到外部查询:

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

GL!

+0

效率如何?看来Hive会首先生成一个大小相同的临时表,然后进行聚合操作? – twds 2015-04-05 08:46:13

+0

你100%正确,它可能会影响性能。但似乎只能省略'Group by'中的函数使用。这里的问题是,如果配置单元在常规查询中两次评估函数值?我的猜测是,这只是一次评估。在这种情况下,您的原始查询似乎是最佳的。 – www 2015-04-05 09:13:39

3

在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