【问题标题】:Hive SELECT records from 1 hour ago1 小时前的 Hive SELECT 记录
【发布时间】:2018-06-22 17:17:58
【问题描述】:

我有一个 hive 表,其中包含一个名为 timestamp 的列。时间戳是从 java System.currenttimemillis() 生成的 bigint 字段。我想它应该是UTC。现在我正在尝试选择 1 小时前的记录。我知道在 MySQL 中你可以这样做:

SELECT * FROM table WHERE datetimefield >= DATE_SUB(NOW(), INTERVAL 1 HOUR)

在 hive 中,NOW() 似乎丢失了。我做了一些搜索,找到了unix_timestamp()。我应该能够通过 unix_timestamp()*1000 获得当前的 UTC 时间(以毫秒为单位)。

因此,如果我想获取 1 小时前的记录,我正在考虑执行以下操作:

SELECT * FROM hivetable WHERE datetimefield >= (unix_timestamp()*1000-3600000); 

有人可以建议这是否是解决此问题的正确方法吗?另外,如果我想像 1 天前一样选择呢?将其转换为毫秒似乎不方便。任何帮助或建议的阅读材料将不胜感激。提前感谢您的帮助。

【问题讨论】:

    标签: hive hiveql unix-timestamp sql-timestamp


    【解决方案1】:

    是的,unix_timestamp() 为您提供自 Unix 纪元以来经过的秒数。您可以减去 60*60*1000 毫秒并比较您的字段以获得所需的记录。

    对于 Hive 1.2.0 及更高版本,您可以使用 current_timestamp

    select * 
    from hivetable 
    where 
         datetimefield >= ((unix_timestamp()*1000) - 3600000);
    

    1天,将毫秒转换为日期格式并使用date_sub

    select * 
    from hivetable 
    where 
         from_unixtime(unix_timestamp(datetimefield,'MM-dd-yyyy HH:mm:ss')) >= 
         date_sub(from_unixtime(unix_timestamp()),1);
    

    【讨论】:

    • 您好,您能解释一下为什么要执行 from_unixtime 吗?另外,做 unix_timestamp(datetimefield,'MM-dd-yyyy HH:mm:ss') 有什么意义?如果我的日期时间字段已经是毫秒,例如 1529600214530,我需要这样做吗?谢谢!
    • 你提到你的字段类型是字符串格式
    • 抱歉,它在 bigint 中。
    • 不,如果您的字段是 bigint 类型及其毫秒,则不必使用 from_unixtime。
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多