计算蜂巢中字符串类型的两列之间的时差,而无需更改数据类型字符串

时间:2018-07-30 09:04:49

标签: database hive hiveql hive-query

我正在尝试计算字符串数据类型的两行之间的时间差。如果它们之间的时间差小于2小时,则选择该行的第一列,否则,如果时间差大于2小时,则选择该行的第二列。可以通过将列转换为日期时间格式来完成,但是我希望结果仅在字符串中。我怎样才能做到这一点?数据如下:

col1(字符串类型)
2018-07-16 02:23:00
2018-07-26 12:26:00
2018-07-26 15:32:00

col2(字符串类型)
2018-07-16 02:36:00
2018-07-26 14:29:00
2018-07-27 15:38:00

2 个答案:

答案 0 :(得分:1)

使用unix_timestamp()将字符串时间戳转换为秒。 时差将为:

hive> select  (unix_timestamp('2018-07-16 02:23:00')- unix_timestamp('2018-07-16 02:36:00'))/60/60;
OK
-0.21666666666666667

重要更新:仅当将时区配置为UTC时,此方法才能正常工作。因为在某些情况下,对于DST时区,Hive会在时间戳操作期间转换时间。考虑以下示例中的PDT时区:

hive> select hour('2018-03-11 02:00:00'); 
OK 
3 

请注意,小时为3,而不是2。这是因为2018-03-11 02:00:00在PDT时区中不存在,因为恰好在2018-03-11 02:00:00时已调整并变为2018-03-11 03:00:00。 转换为unix_timestamp时也会发生同样的情况。对于PDT时区,unix_timestamp('2018-03-11 03:00:00')和unix_timestamp('2018-03-11 02:00:00')将返回相同的时间戳:

hive> select unix_timestamp('2018-03-11 03:00:00');
OK
1520762400
hive> select unix_timestamp('2018-03-11 02:00:00');
OK
1520762400

以及一些链接供您参考:

https://community.hortonworks.com/questions/82511/change-default-timezone-for-hive.html

http://boristyukin.com/watch-out-for-timezones-with-sqoop-hive-impala-and-spark-2/

也请看看这个吉拉:Hive should carry out timestamp computations in UTC

答案 1 :(得分:1)

我认为您不需要将列转换为日期时间格式,因为您的案例中的数据已经排序(yyyy-MM-dd hh:mm:ss)。您只需要将所有数字都放入一个字符串(yyyyMMddhhmmss)中,然后就可以应用大于或小于2小时(此处为20000,因为小时后面是mmss)的选择。通过查看您的示例(假设col2> col1),此查询将起作用:

SELECT case when regexp_replace(col2,'[^0-9]', '')-regexp_replace(col1,'[^0-9]', '') < 20000 then col1 else col2 end as col3 from your_table;