按生成的列分组

时间:2013-09-17 05:57:49

标签: sql hadoop hive

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

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;

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

  

FAILED:SemanticException [错误10004]:第1行:134无效表   别名或列引用' :(可能的列名是:time,ip,   用户名,代码)

hive不支持它吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

作为is the case with most relational database systemsSELECT子句在GROUP BY子句之后处理。这意味着您无法在SELECT中使用ts中的别名(例如此示例中为GROUP BY)。

基本上有两种解决方法。两者都是正确的,但有些人出于各种原因偏好一个人。

首先,您可以按原始表达式而不是别名进行分组。这会导致代码重复,因为您在SELECTGROUP 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;

两者都应该有相同的结果。在这种情况下你应该使用哪些将取决于你的具体用途;或者个人偏好。

希望有所帮助。