2015-04-04 73 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