根据 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附近缺少右括号 @Cyber​​netic:已修复 为了确定,no_hits 是点击数,而不是“没有点击” @Cyber​​netic:是的,没错。 谢谢。您的查询看起来很棒,我只是无法解释时间间隔为 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 表中的时间戳确定每个唯一值的采样间隔的主要内容,如果未能解决你的问题,请参考以下文章

SQL / Hive 选择具有特定列值的第一行

MATLAB中的FFT的采样频率和采样点怎样确定

Hive 未检测到时间戳格式

以任意时间戳格式将数据导入 Hive

将系统时间戳插入配置单元表中的时间戳字段

在 Hive 中将 Long 转换为时间戳