2

我有一个相当有趣的问题,我最初认为它是直截了当的,但结果却更加复杂。

我有这样的数据:

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 年 5 月 31 日活跃,但在 06 月 1 日到 06 月 10 日之间的任何一天都没有活跃,我想在 6 月 10 日统计这个用户。除非他变得活跃并再次消失,否则我不会在接下来的几天里再次数他。

我可以在 SQL 中执行此操作,还是需要某种脚本以我想要的方式组织数据。你有什么建议?我使用蜂巢。

太感谢了!

4

1 回答 1

2

我认为您可以在 Hive 兼容的 SQL 中执行此操作。这是想法。

  1. 对于每个用户/日期,获取用户的下一个日期。
  2. 如果下一个记录在当前记录之后不到 10 天,则丢弃原始记录。
  3. 日期加 10
  4. 汇总和计数

我不确定日期之类的所有 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 是否支持这样的连接(它不支持非等连接,并且不清楚一个或所有子句是否必须相等)。

于 2013-06-06T23:31:34.057 回答