【问题标题】:Hive - calculating string type timestamp differences in minutesHive - 以分钟计算字符串类型时间戳差异
【发布时间】:2021-05-06 14:02:57
【问题描述】:

我是 SQL 新手(在 hive 中),我试图计算每个匿名 ID 在第一个事件和最后一个事件之间花费的时间(以分钟为单位)。资源表的时间戳被格式化为字符串, 比如:“2020-12-24T09:47:17.775Z”。我尝试了两种方式:

1- 将列时间戳转换为 bigint 并计算与主表的差异。

select anonymousid, max(from_unixtime(cast('timestamp' as bigint)) - min(from_unixtime(cast('timestamp' as bigint)) from db1.formevent group by anonymousid

在将其作为解决方案实施后,我得到了 NULL。

2- 从主资源创建一个新表,使用“where”设置要调用的条件,并尝试将“timestamp”转换为日期格式,而不进行任何最小-最大计算。

create table db1.successtime as select anonymousid, pagepath,buttontype, itemname, 'location', cast(to_date(from_unixtime(unix_timestamp('timestamp', "yyyy-MM-dd'T'HH:mm:ss.SSS"),'HH:mm:ss') as date) from db1.formevent where pagepath = "/account/sign-up/" and itemname = "Success" and 'location' = "Standard"

然后我又得到了 NULL,然后我离开了。 It looks like this

有什么方法可以重新格式化和计算第一个事件和最后一个事件('timestamp')之间的时间差以分钟为单位,并取按“位置”分组的平均值?

【问题讨论】:

标签: sql hive casting timestamp hiveql


【解决方案1】:
select anonymousid,
       (max(unix_timestamp(timestamp, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")) - 
        min(unix_timestamp(timestamp, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")) 
       ) / 60
from db1.formevent
group by anonymousid;

【讨论】:

  • 谢谢。我得到零作为输出。我认为它正在计算小时差,我应该更改除数吗? @leftjoin
  • @Ipek 检查这个例子:select unix_timestamp('2020-12-24T09:47:17.775Z', "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")- unix_timestamp('2020-12-24T09:47:00.775Z', "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") Result=17 unix_timestamp 给出秒(bigint)。如果你像这样转换,毫秒会丢失
  • @Ipek 另请阅读有关毫秒的帖子:stackoverflow.com/a/58713989/2700344
  • @Ipek @Ipek 毫秒精度(seconds.milliseconds):select cast(timestamp(regexp_replace("2019-11-02T20:18:12.123Z", '^(.+?)T(.+?)Z$','$1 $2')) as double)- cast(timestamp(regexp_replace("2019-11-02T20:18:11.000Z", '^(.+?)T(.+?)Z$','$1 $2')) as double)
  • @Ipek 但最好将毫秒部分单独提取和处理为 int 以消除双精度问题
【解决方案2】:

根据您的描述,这应该可行:

select anonymousid,
       (max(unix_timestamp(timestamp, 'yyyy-MM-dd'T'HH:mm:ss.SSS'),'HH:mm:ss') - 
        min(unix_timestamp(timestamp, 'yyyy-MM-dd'T'HH:mm:ss.SSS'),'HH:mm:ss') 
       ) / 60
from db1.formevent
group by anonymousid;

请注意,列名不是单引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多