Hive 蜂巢中的日期比较

Hive 蜂巢中的日期比较,hive,timestamp,hiveql,ddl,Hive,Timestamp,Hiveql,Ddl,我正在使用Hive,我有一个如下结构的表: CREATE TABLE t1 ( id INT, created TIMESTAMP, some_value BIGINT ); 我需要找到t1中小于180天的每一行。即使表中存在与搜索谓词匹配的数据,以下查询也不会生成任何行 select * from t1 where created > date_sub(from_unixtime(unix_timestamp()), 180); 在Hive中执行日期比较的合适方式是什

我正在使用Hive,我有一个如下结构的表:

CREATE TABLE t1 (
  id INT,
  created TIMESTAMP,
  some_value BIGINT
);
我需要找到
t1
中小于180天的每一行。即使表中存在与搜索谓词匹配的数据,以下查询也不会生成任何行

select * 
from t1 
where created > date_sub(from_unixtime(unix_timestamp()), 180);

在Hive中执行日期比较的合适方式是什么?

在回顾了这一点并参考了我提出的解决方案后。虽然我不确定为什么Hive不能有效地将日期作为字符串进行比较(它们应该按字典顺序进行排序和比较),但以下解决方案是有效的:

FROM (
    SELECT  id, value,
            unix_timestamp(created) c_ts, 
            unix_timestamp(date_sub(from_unixtime(unix_timestamp()), 180), 'yyyy-MM-dd') c180_ts
    FROM    t1
) x
JOIN t1 t ON x.id = t.id
SELECT  to_date(t.Created), 
        x.id, AVG(COALESCE(x.HighestPrice, 0)), AVG(COALESCE(x.LowestPrice, 0))
WHERE   unix_timestamp(t.Created) > x.c180_ts
GROUP BY to_date(t.Created), x.id ;
那么:

where unix_timestamp() - created < 180 * 24 * 60 * 60
浏览每个UDF:

  • unix\u timestamp()
    返回一个int:自epoch以来的当前时间(以秒为单位)
  • from_unixtime(,'yyyy-MM-dd')
    转换为给定格式的字符串,例如'2012-12-28'
  • date\u sub(,180)
    从该字符串中减去180天,并以相同格式返回一个新字符串
  • unix\u时间戳(,'yyyy-MM-dd')
    将该字符串转换回int

  • 如果这一切变得太复杂,你可以自己编写一个UDF。

    我认为这可能是一个处理时间戳类型的蜂巢bug。我最近一直在尝试使用它,但结果不正确。 如果我将您的模式更改为使用字符串而不是时间戳,并在

    yyyy MM dd HH:MM:ss

    格式化,然后选择查询对我有效

    根据文档,Hive应该能够将表示历元秒的BIGINT转换为时间戳,并且所有现有的datetime UDF都使用时间戳数据类型

    通过这个简单的查询:

    从unix\u timestamp()中选择,将unix\u timestamp()转换为 时间戳)从测试限制1开始

    我希望这两个字段是相同的,但我得到:

    2012-12-29 00:47:43 1970-01-16 16:52:22.063


    我也看到了其他奇怪之处。

    或者,您也可以使用datediff。那么where子句将是
    如果是字符串时间戳(jdbc格式):

    datediff(从unixtime(unix\u timestamp()),创建)<180;
    
    如果是Unix纪元时间:

    datediff(from_unixtime(unix_timestamp()), from_unixtime(created)) < 180;
    
    datediff(from_unixtime(unix_timestamp()),from_unixtime(created))<180;
    
    时间戳为毫秒
    unix\u时间戳以秒为单位
    你需要把RHS乘以1000

    where created > 1000 * date_sub(from_unixtime(unix_timestamp()), 180);
    

    对我最终使用的解决方案的精彩解释。一个问题-在这种情况下,
    时间戳
    /
    字符串
    INT
    之间的比较是否可行?后续问题-时间戳/
    字符串
    INT
    之间的比较是否可行。感谢您提供的这些信息,它很好地简化了查询。这看起来像在中报告的,但还没有做任何工作来修复它,因为配置单元维护人员希望确保与损坏的行为向后兼容。@JeremiahPeschka谢谢,plus有解决方法。。。我也应该在那里搜索我的其他时间戳问题。
    datediff(from_unixtime(unix_timestamp()), from_unixtime(created)) < 180;
    
    where created > 1000 * date_sub(from_unixtime(unix_timestamp()), 180);