hive窗口函数范围超过时间戳列(以纳秒为单位)

xj3cbfub  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(442)

我有一个包含时间戳列、id列和电子邮件列的配置单元表,如下所示:

Insert_tm                 ID   email
2020-04-01 02:03:05:857   1    xxx@mail.com
2020-04-01 02:03:05:879   2    xxx@mail.com
2020-04-01 03:05:08:678   3    xxy@mail.com
2020-04-01 03:05:09:789   4    xxy@mail.com

我试图计算的数字,唯一的id,共享相同的电子邮件地址之前(包括)每一行在一个小时内的基础上插入。我希望得到以下结果:

Insert_tm                 ID   email           Count
2020-04-01 02:03:05:857   1    xxx@mail.com    1
2020-04-01 02:03:05:879   2    xxx@mail.com    2
2020-04-01 03:05:08:678   3    xxy@mail.com    1
2020-04-01 03:05:09:789   4    xxy@mail.com    2

我的解决方案是使用如下配置单元窗口功能:

select insert_tm, id, email, count(id) over (partition by email order by insert_tm range between 3600 preceding and current row) as count

但我得到以下结果:

Insert_tm                 ID   email           Count
2020-04-01 02:03:05:857   1    xxx@mail.com    2
2020-04-01 02:03:05:879   2    xxx@mail.com    2
2020-04-01 03:05:08:678   3    xxy@mail.com    1
2020-04-01 03:05:09:789   4    xxy@mail.com    2

id=1的计数是2而不是1。当有另一条记录在1秒内有insert_tm差异时,就会发生这种情况。
即使在纳秒级,也有办法得到正确的计数吗?

njthzxwz

njthzxwz1#

这个答案有点猜测。
首先,时间戳可以通过两种不同的方式转换为数字:
到整数(秒)
浮点数(对于秒分数的unix历元)
配置单元中的窗框只接受一个数字。然而——这就是推测的地方——文档没有指定数字的类型。
我认为“数字”实际上是一个整数。这反过来会导致 timestamp 一个整数。作为整数,前两行具有相同的值——因此都被计数。
我怀疑显式转换为浮点类型可以解决问题:

count(id) over (partition by email
                order by cast(insert_tm as double)
                range between 3600 preceding and current row
               ) as count

相关问题