我有一个相当有趣的问题,我首先想到的是直截了当,但事实证明它更复杂。
我有这样的数据:
Date User ID
2012-10-11 a
2012-10-11 b
2012-10-12 c
2012-10-12 d
2012-10-13 e
2012-10-14 b
2012-10-14 e
... ...
每一行都有一个日期,用户ID对,表示该用户当天处于活动状态。用户可以出现在多个日期,日期将有多个用户 - 就像示例中一样。我有这样的数百万行,涵盖了大约90天的时间范围。
以下是问题:对于每一天,我想获得过去10天内没有活动的用户数量。例如,如果用户“a”在2012-05-31有效,但在06-01和06-10之间的任何一天都没有激活,我想在6月10日计算这个用户。在接下来的几天里我不会再算他了,除非他变得活跃并且再次消失。
我可以在SQL中执行此操作,还是需要某种脚本来按照我想要的方式组织数据。你的建议是什么?我使用Hive。
非常感谢你!
答案 0 :(得分:2)
我认为您可以在与Hive兼容的SQL中执行此操作。这是想法。
我不确定日期之类的所有Hive函数。以下是如何执行此操作的示例:
select date+10, count(*)
from (select t.userid, t.date,
min(case when tnext.date > t.date then tnext.date end) as nextdate
from t left outer join
t tnext
on t.userid = tnext.userid
group by t.userid, t.date
) t
where nextdate is null or nextdate - date >= 10
group by date+10;
请注意,使用以下内容可以更好地编写内部子查询:
on t.userid = tnext.userid and t2.date > t.date
但是,我不知道Hive是否支持这样的连接(它不支持非等值连接,并且不清楚一个或所有子句是否必须相等)。