我尝试按分钟分组数据,所以我尝试了这个查询:
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不支持它吗?
答案 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 systems,SELECT
子句在GROUP BY
子句之后处理。这意味着您无法在SELECT
中使用ts
中的别名(例如此示例中为GROUP BY
)。
基本上有两种解决方法。两者都是正确的,但有些人出于各种原因偏好一个人。
首先,您可以按原始表达式而不是别名进行分组。这会导致代码重复,因为您在SELECT
和GROUP 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;
两者都应该有相同的结果。在这种情况下你应该使用哪些将取决于你的具体用途;或者个人偏好。
希望有所帮助。