无法在Hive查询中减去涉及别名的两列

时间:2015-04-14 01:12:31

标签: hadoop hive

我正在尝试执行以下查询,其中我使用窗口来获取下一个日志时间戳,然后在它与当前时间戳之间进行减法。

SELECT
  LEAD(timestamp) OVER (PARTITION BY id ORDER BY timestamp) AS lead_timestamp,
  timestamp,
  (lead_timestamp - timestamp) as delta
FROM logs;

然而,当我这样做时,我收到以下错误:

失败:SemanticException [错误10004]:第4行:1无效的表别名或列引用'lead_timestamp':(可能的列名是:logs.timestamp,logs.latitude,logs.longitude,logs.principal_id)

如果我放弃这个减法,查询的其余部分就可以了,所以我很难过 - 我是否使用上面错误的AS语法进行lead_timestamp?

1 个答案:

答案 0 :(得分:3)

Hive的一个限制是您不能引用在同一查询中指定的别名(HAVING子句除外)。这是由于代码围绕别名构建的方式。你必须使用子查询来写这个。

SELECT lead_timestamp, timestamp, (lead_timestamp - timestamp) AS delta
FROM (
    SELECT LEAD(timestamp) OVER (PARTITION BY id ORDER BY timestamp) AS lead_timestamp,
           timestamp
    FROM logs
) a;

这很难看,但很有效。