2016-11-24 48 views
0

我想在配置單元中使用不同的窗口函數計數,並獲取錯誤。HIVE:計數截然不同的窗口函數拋出錯誤

使用的查詢如下:

select user, dt, count(distinct dt) over(partition by user) as dates 
FROM table 

它引發以下錯誤:

FAILED: SemanticException [Error 10025]: Line 1:123 Expression not in GROUP BY key 'user' 

我覺得我現在用的語法在蜂巢指定language manual

究竟我做錯了嗎?

+0

您需要在查詢中添加group by子句才能使用count之類的聚合函數。 – Bhavesh

+0

我想使用計數不同作爲窗口函數,而不是作爲一個常規函數。給一個羣組工作,但它作爲一個常規函數運行,忽略了'over(按用戶分區)'部分。 –

回答

1

兩種可能性,

  1. 使用distinct時,您不能在查詢中選擇userdt,刪除userdt查詢將正常工作。

  2. 在這種情況下,您不能使用distinct,如果您在上述查詢中刪除distinct,這將工作正常。如果你想利用不同的,其計,你可以去像下面的子查詢,

    select dates.distinct dt from (select dt, count(distinct dt) over(partition by user) as dates FROM table)

讓我知道,如果這有助於。

+0

這些建議有幫助,但他們需要額外的子查詢或連接。我希望使用窗口函數獲取數據,以便查詢可以更快。但是現在我不確定配置單元是否支持統計不同的窗口函數。 –

+0

它支持它..但你不能選擇任何其他列。 –

+0

但是,如果我無法選擇任何其他列,我可以使用明顯的計數明確的權利?窗口統計獨特功能提供什麼優勢 –

0

以下解決方案將像計數截然不同。 密集排名函數將給出分區內不同c的排名。 密度最高的排名數將是c的不同條目的數量。 由於執行兩個窗口函數,沒有安靜的表現最好的方式,但對我來說,這是讓它在Hive < 2.1.0上工作的唯一方法。

select src.a, src.b, src.c, max(src.cnt_dens_rank) over (PARTITION BY src.a, src.b) as cnt_distinct 
from 
(
select a, b, c, DENSE_RANK () OVER (PARTITION BY a, b order by c) cnt_dens_rank 
) src