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

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

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

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

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

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

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

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

但我得到以下结果:

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

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

njthzxwz

njthzxwz1#

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

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

相关问题