我有一个HIVE表:
device timestamp value
d_1 2020-08-15 00:05:00 10
d_1 2020-08-15 00:10:00 12
d_1 2020-08-15 00:15:00 08
d_2 2020-08-15 00:05:00 62
d_2 2020-08-15 00:25:00 14
d_2 2020-08-15 00:45:00 10
注意设备d_1的时间间隔(5秒(与设备d_2(20秒(不同。
对于一个包含数百万行的大表,如何确定所有唯一设备的采样间隔?
我正在寻找这样的输出:
device sampling_interval(mins)
d_1 5
d_2 20
最安全的方法是使用lag()
计算同一设备的连续数据点之间每个间隔的持续时间,然后计算每个间隔发生的次数:
select
device,
(unix_timestamp(ts) - unix_timestamp(lag_ts)) / 60 sampling_interval_minutes,
count(*) no_hits
from (
select
t.*,
lag(ts) over(partition by device order by ts) lag_ts
from mytable t
) t
group by device, (unix_timestamp(ts) - unix_timestamp(lag_ts)) / 60
order by device, no_hits desc
这样可以很容易地检查间隔的一致性,并查看哪一个间隔发生得最多。
您可以使用获得平均差异
select device,
(unix_timestamp(max(timestamp)) - unix_timestamp(min(timestamp))) / nullif(count(*) - 1, 0)
from t
group by device;
这给出了行之间时间戳的平均差异。