在where子句中将字符串更改为datetime格式以进行比较

时间:2016-12-21 16:34:57

标签: datetime hive impala

我有一个如下所示的数据集:

datetime                                 count        
18:28:20.602 UTC DEC 08 2016                1
20:42:32.017 UTC DEC 08 2016                5
15:33:40.691 UTC DEC 08 2016                1
17:11:54.008 UTC DEC 08 2016                3
20:28:57.861 UTC DEC 08 2016                0
.
.
.
.

datetime列采用字符串格式。我很难将其转换为时间戳。

如何编写Impala / Hive查询,以便在2016年12月8日18:28:000 UTC之间获取数据'到2016年12月8日18:33:00 UTC'

1 个答案:

答案 0 :(得分:0)

使用Hive:

cast(from_unixtime(unix_timestamp(SHITTY_FORMAT, 'HH:mm:ss.SSS zzz MMM dd yyyy'), 'yyyy-MM-dd HH:mm:ss.SSS') as Timestamp)

...将您的shitty String格式转换为UNIX时间戳,然后转换为String标准格式(在本地时区,因为它是Hive约定),然后转换为时间戳。
不幸的是,没有更简单的方法。 由于夏季/冬季时间重叠1小时,您可能会遇到一些边缘情况

来源:Hive documentation,当然......

<小时/> 使用Impala (不支持zzz格式修饰符)

cast(from_unixtime(unix_timestamp(regexp_replace(SHITTY_FORMAT, ' UTC ', ' '), 'HH:mm:ss.SSS MMM dd yyyy'), 'yyyy-MM-dd HH:mm:ss.SSS') as Timestamp) 

...会将您的糟糕String格式转换为UNIX时间戳, 假设所有输入都是UTC ,然后转换为String标准格式(因为UTC时区,因为这是Impala惯例),然后是时间戳。