4

我试图按分钟对数据进行分组,所以我尝试了这个查询:

SELECT FROM_UNIXTIME(
     unix_timestamp (time, 'yyyy-mm-dd hh:mm:ss'), 'yyyy-mm-dd hh:mm') as ts,
     count (*) as cnt 
     from toucher group by ts limit 10;

然后蜂巢告诉我没有这样的专栏,

FAILED: SemanticException [Error 10004]: Line 1:134 Invalid table alias or column reference 'ts': (可能的列名是: time, ip, username, code)

那么hive不支持吗?

4

2 回答 2

6
SELECT FROM_UNIXTIME(unix_timestamp (time, 'yyyy-mm-dd hh:mm:ss'), 'yyyy-mm-dd hh:mm') as ts,
     count (*) as cnt 
from toucher 
group by FROM_UNIXTIME(unix_timestamp (time, 'yyyy-mm-dd hh:mm:ss'), 'yyyy-mm-dd hh:mm') limit 10;

或更好

 select t.ts, count(*) from
(SELECT FROM_UNIXTIME(unix_timestamp (time, 'yyyy-mm-dd hh:mm:ss'), 'yyyy-mm-dd hh:mm') as ts             
    from toucher ) t
    group by t.ts limit 10;
于 2013-09-17T06:08:42.740 回答
2

大多数关系数据库系统一样SELECT子句在子句之后处理GROUP BYSELECT这意味着您不能tsGROUP BY.

基本上有两种方法可以解决这个问题。两者都是正确的,但有些人出于各种原因偏爱其中之一。

首先,您可以按原始表达式而不是别名进行分组。这会导致代码重复,因为您的SELECTandGROUP BY子句中的表达式完全相同。

SELECT 
    FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm') as ts,
    COUNT(*) as cnt 
FROM toucher 
GROUP BY FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm')
LIMIT 10;

第二种方法是将表达式和别名包装在子查询中。这意味着您不必复制表达式,但您将有两个嵌套查询,这可能会影响性能。

SELECT 
    ts,
    COUNT(*) as cnt 
FROM 
    (SELECT
        FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm') as ts,
     FROM toucher) x
GROUP BY x.ts
LIMIT 10;

两者应该有相同的结果。在这种情况下您应该使用哪个取决于您的特定用途;或者也许是个人喜好。

希望有帮助。

于 2013-09-17T07:52:51.930 回答