计算Hive中计数器数据的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算Hive中计数器数据的差异相关的知识,希望对你有一定的参考价值。

我有计数器数据存储在Hive表中。计数器在时间上递增,有时会重置为零。

我想计算连续行之间的差异,但是在计数器重置的情况下,差异是负的。这里有一个示例数据和预期输出:

data:       1, 3, 6,  7, 1, 4
difference: 2, 3, 1, -6, 3, NA
expected:   2, 3, 1,  1, 3, NA 

通常,这种操作是通过计算滞后并从数据中减去它来完成的。在负差异的情况下,我们应该只设置滞后的值,这是函数的一个例子,它在R / dplyr中这样做:

diff_counter <-function(x){  
  # count difference between measurements
  lag <- lag(x) 
  dx <- x - lag 
  reset_idx <- dx < 0 & !is.na(dx)
  dx[reset_idx] = lag[reset_idx]
  return(dx)
}

我可以在Hive中做类似的事情吗?

关心Paweł

答案

假设t是你的datetime列并且计数器按此顺序递增,你可以使用带有CASE函数的LEAD块。

SELECT x
    ,CASE 
        WHEN (
                LEAD(x) OVER (
                    ORDER BY t
                    ) - x
                ) > 0
            THEN LEAD(x) OVER (
                    ORDER BY t
                    ) - x
        ELSE LEAD(x) OVER (
                ORDER BY t
                )
        END AS diff
FROM yourtable;


| X |   DIFF |
|---|--------|
| 1 |      2 |
| 3 |      3 |
| 6 |      1 |
| 7 |      1 |
| 1 |      3 |
| 4 | (null) |

以上是关于计算Hive中计数器数据的差异的主要内容,如果未能解决你的问题,请参考以下文章

计算 Hive/Spark/SQL 中的每小时进程计数

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

会话计数之间的差异

匹配行的计数并从 hive 中的每个计数组中选择 30

GaussDB(DWS)与Hive在功能上存在一定的差异

计算并显示两个 NSDate 之间的时间