根据 HIVE 表中的时间戳确定每个唯一值的采样间隔
Posted
技术标签:
【中文标题】根据 HIVE 表中的时间戳确定每个唯一值的采样间隔【英文标题】:Determine sampling interval for each unique value, from timestamps in HIVE table 【发布时间】:2020-09-12 01:02:57 【问题描述】:我有一个 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
【问题讨论】:
如果采样间隔不是恒定的,比如设备缺少一些数据点,或者它的间隔发生变化怎么办? 【参考方案1】:最安全的方法是使用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
这可以很容易地检查间隔的一致性,并查看哪个间隔出现最多。
【讨论】:
我从这个查询中得到解析错误。不知道如何解决。它说EOF附近缺少右括号 @Cybernetic:已修复 为了确定,no_hits 是点击数,而不是“没有点击” @Cybernetic:是的,没错。 谢谢。您的查询看起来很棒,我只是无法解释时间间隔为 0 的 #命中。对于预期的非零时间间隔(例如 5 分钟),我确实得到了正确的命中数,但我也得到了数百万行,时间间隔为 0。为什么有这么多 0 用于 # 个命中?这些是不断重复的 27 天时间块。【参考方案2】:您可以使用以下方法获得平均差异:
select device,
(unix_timestamp(max(timestamp)) - unix_timestamp(min(timestamp))) / nullif(count(*) - 1, 0)
from t
group by device;
这给出了行之间时间戳的平均差异。
【讨论】:
我得到了错误的值。对于我知道有 5 分钟采样间隔的设备,我得到 ~0.2。这恰好是采样频率(不是间隔),但我认为这也不是计算的。 有没有办法在不使用 unixtimestamp 的情况下做到这一点?我认为我的日期不适用于 unixtimestamp。 这给出了每台设备的平均秒数差异。unix_timestamp()
应该适用于格式合理的数据值。以上是关于根据 HIVE 表中的时间戳确定每个唯一值的采样间隔的主要内容,如果未能解决你的问题,请参考以下文章