Hive 计算配置单元中计数器数据的差异

Hive 计算配置单元中计数器数据的差异,hive,Hive,我将计数器数据存储在配置单元表中。计数器在时间上递增,有时重置为零 我想计算连续行之间的差异,但在计数器重置的情况下,差异为负数。示例数据和预期输出如下所示: data: 1, 3, 6, 7, 1, 4 difference: 2, 3, 1, -6, 3, NA expected: 2, 3, 1, 1, 3, NA 通常这种操作是通过计算滞后并从数据中减去它来完成的。在负差的情况下,我们应该只输入lag的值,下面是函数的一个示例,它在R/dplyr中执行此操作: d

我将计数器数据存储在配置单元表中。计数器在时间上递增,有时重置为零

我想计算连续行之间的差异,但在计数器重置的情况下,差异为负数。示例数据和预期输出如下所示:

data:       1, 3, 6,  7, 1, 4
difference: 2, 3, 1, -6, 3, NA
expected:   2, 3, 1,  1, 3, NA 
通常这种操作是通过计算滞后并从数据中减去它来完成的。在负差的情况下,我们应该只输入lag的值,下面是函数的一个示例,它在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)
}

diff_counter假设
t
是您的日期时间列,并且计数器按该顺序递增,您可以将
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) |

是否有任何列指定排序?是的,有一个时间列指定数据在时间中的顺序是的,这是我想要的,但还有一个问题:如何使用GROUP BY的这种构造?t不在GROUP BY子句中,我得到“表达式不在GROUP BY key中”@PawelStradowski:您可以用别名嵌套查询,并在其上方使用
GROUP BY
。请注意,在使用group by时,应将所有列包括在
group by
中的
select
子句中。试着更多地了解如何在sql中使用GROUPBY,如果您不清楚,或者您可能会问另一个问题。我希望这个答案对你有帮助,解决你最初的问题。