我正在使用Presto和Zeppelin。有很多原始数据。我必须总结这些数据。
我想每 5 秒对时间进行分组。
serviceType logType date
------------------------------------------------------
service1 log1 2017-10-24 23:00:23.206
service1 log1 2017-10-24 23:00:23.207
service1 log1 2017-10-24 23:00:25.206
service2 log1 2017-10-24 23:00:24.206
service1 log2 2017-10-24 23:00:27.206
service1 log2 2017-10-24 23:00:29.302
那么结果
serviceType logType date cnt
--------------------------------------------------------------
service1 log1 2017-10-24 23:00:20 2
service2 log1 2017-10-24 23:00:20 1
service1 log1 2017-10-24 23:00:25 1
service1 log2 2017-10-24 23:00:25 2
首先,我必须将存储的数据迁移到新表。
其次,我必须对数据进行分组并实时保存到新表中。
编写 sql 脚本很难。
请帮助我。
我必须使用python解释器吗?
你可以
- 使用
date_trunc
丢弃timestamp
的毫秒部分 - 您可以使用
ts - interval '1' second * (second(ts) % 5)
将不带毫秒部分的timestamp
舍入为 5 秒
示例将其放在一起:
presto> SELECT ts_rounded, count(*)
-> FROM (
-> SELECT date_trunc('second', ts) - interval '1' second * (second(ts) % 5) AS ts_rounded
-> FROM (VALUES timestamp '2017-10-24 23:01:20.206',
-> timestamp '2017-10-24 23:01:23.206',
-> timestamp '2017-10-24 23:01:23.207',
-> timestamp '2017-10-24 23:01:26.206') AS t(ts)
-> )
-> GROUP BY ts_rounded ORDER BY ts_rounded;
ts_rounded | _col1
-------------------------+-------
2017-10-24 23:01:20.000 | 3
2017-10-24 23:01:25.000 | 1
(2 rows)
这给了 5 分钟的存储桶
from_unixtime((cast(to_unixtime(timestamp_column_name) as bigint)/60/5)*60*5)
这给了 60 秒的存储桶
from_unixtime((cast(to_unixtime(timestamp_column_name) as bigint)/60)*60)
这给了 5 秒的存储桶
from_unixtime((cast(to_unixtime(timestamp_column_name) as bigint)/5)*5)
到目前为止,这是我所知道的最好的技巧,因为它非常简单并且适用于所有数据库。它在四舍五入除法时使用精度损失。我们都有以 UTC 毫秒为单位的所有时间戳,因此按窗口聚合非常容易。