我有日期和州的记录。我想只显示状态从上一条记录改变的记录。
示例输入
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
函数吗?
答案 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 ;