我试图计算字符串数据类型的行的两列之间的时间差。如果两者之间的时差小于2小时,则选择该行的第一列;如果时差大于2小时,则选择该行的第二列。可以通过将列转换为datetime格式来完成,但我希望结果仅为字符串。我该怎么做?数据如下所示:
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条答案
按热度按时间gxwragnw1#
使用unix\u timestamp()将字符串时间戳转换为秒。时差为:
重要更新:只有将时区配置为utc时,此方法才能正常工作。因为对于一些边缘情况的dst时区,hive在时间戳操作期间转换时间。请考虑以下pdt时区示例:
注意时间是
3
,不是2
. 这是因为2018-03-11 02:00:00
无法在pdt时区中存在,因为正好在2018-03-11 02:00:00
时间被调整,变得2018-03-11 03:00:00
. 转换为unix\u时间戳时也会发生同样的情况。对于pdt时区,unix\u timestamp('2018-03-11 03:00:00')和unix\u timestamp('2018-03-11 02:00:00')将返回相同的时间戳:还有一些链接供您参考:
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/
请看一下这个jira:hive应该在utc中执行时间戳计算
lvjbypge2#
我认为您不需要将列转换为datetime格式,因为您案例中的数据已经被排序(yyyy-mm-dd hh:mm:ss)。您只需将所有数字转换成一个字符串(yyyymmddhhmmss),然后您就可以应用大于或小于2小时的选择(这里是20000,因为小时后是彩信)。通过查看您的示例(假设col2>col1),此查询将起作用: