计算配置单元中字符串类型的两列之间的时间差,而不更改数据类型字符串

cedebl8k  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(384)

我试图计算字符串数据类型的行的两列之间的时间差。如果两者之间的时差小于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

gxwragnw

gxwragnw1#

使用unix\u 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\u时间戳时也会发生同样的情况。对于pdt时区,unix\u timestamp('2018-03-11 03:00:00')和unix\u 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/
请看一下这个jira:hive应该在utc中执行时间戳计算

lvjbypge

lvjbypge2#

我认为您不需要将列转换为datetime格式,因为您案例中的数据已经被排序(yyyy-mm-dd hh:mm:ss)。您只需将所有数字转换成一个字符串(yyyymmddhhmmss),然后您就可以应用大于或小于2小时的选择(这里是20000,因为小时后是彩信)。通过查看您的示例(假设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;

相关问题