Hive 2条记录之间的差异

时间:2015-03-20 10:56:40

标签: hive lag records difference

我有日期和州的记录。我想只显示状态从上一条记录改变的记录。

示例输入

date                  state
2013-01-15 04:15:07.602 ON
2013-01-15 05:15:08.502 ON
2013-01-15 06:15:08.502 OFF
2013-01-15 07:15:08.502 ON
2013-01-15 08:15:08.502 ON
...

预期输出

date                    state
2013-01-15 04:15:07.602 ON
2013-01-15 06:15:08.502 OFF
2013-01-15 07:15:08.502 ON

我写了一个简单的udf函数(我的查询中的tmchange),如果状态已经改变则返回值,否则返回null。

select t.date, t.state from (SELECT date,  state, tmchange(LAG(state, 1) 
over (PARTITION BY month(date) ORDER BY date), state ) as lagres  
from demo_table where state is not null  
and  year=2013) t where t.lagres is not null ;

我使用hive窗口函数中的LAG函数。问题是,当我使用error: Java heap space时,我会PARTITION by month(date)。当我尝试PARTITION by weekofyear(date)时,它可以工作,但可能需要花费太多时间才能使用LAG函数。 您是否知道如何优化我的查询以满足此需求(更通常是将记录与之前的记录进行比较)。在这种情况下,它真的是LAG函数吗?

1 个答案:

答案 0 :(得分:3)

除非减小分区大小,否则不确定是否可以更快地完成任务。您能否按日期而不是按月或按周进行分区:PARTITION BY month(date), day(date)

为什么要使用UDF?这不会起作用:

SELECT t.date, t.state 
FROM (
  SELECT
    date, 
    state, 
    LAG(state) OVER (PARTITION BY month(date) ORDER BY date) AS prev_state
  FROM demo_table 
  WHERE state IS NOT NULL and year=2013
) t 
WHERE t.prev_state != t.state ;
相关问题