Hive:计算运行DISTINCT

时间:2015-07-09 07:27:05

标签: mysql hadoop hive

嗨,有没有办法计算HIVE中的运行次数?

我有一个数据框,其中包含日期和小时以及当前访问网站的人员ID。

我想要做的是知道“累积”计数的区别 id按日期分割。

我不能使用dt,小时,计数(不同的id)组,因为如果是玩家 在1和2处有效,它将被计算两次。

有没有办法使用Hive分析和窗口来做到这一点?

我试过了:

select date, hour, 
      count(distinct id) over( partition by date order by hrs rows between unbounded preceding and current row) users
from db.table

但它会引发错误。

2 个答案:

答案 0 :(得分:0)

我认为你最好用case语句进行连接。

然后您可以轻松地执行以下操作:

select a.date,
  count(DISTINCT CASE WHEN (prior_date < date) THEN b.id ELSE NULL END)
from 
my_table a
left outer join
(select date as prior_date, id from my_table) b
 on (1=1)
 where a.date > b.date
;

这是一个假设日期是字符串可比的。您可以通过以下方式执行此操作,并假设您的日期都是相当近的,因此字符串大小相同。否则你可能需要用零填充字符串。见下文:

假设您的日期和时间类似于yyyy-MM-dd和HH:mm:ss,那么请将您的日期和时间转换为unix_time_stamp,如下所示:

unix_timestamp(concat_ws(" ", date, time)) as date

答案 1 :(得分:0)

你的直觉很明显,Hive只是不喜欢用窗口函数来计算。解决方法是收集到一个集合,然后在窗口上获取每个数组的大小。我做了一些随机数据,以确保这是你想要的。说你有

date        hour    user_id
2015-01-01  1       1001
2015-01-01  1       1001
2015-01-01  2       1002
2015-01-01  7       1003
2015-01-02  4       1001
2015-01-02  4       1001
2015-01-02  5       1002
2015-01-03  1       1004
2015-01-03  3       1005
2015-01-03  4       1001
2015-01-03  4       1002

<强>查询

select date
  , hour
  , size(collect_set(user_id) over (partition by date order by hour
                                    rows between unbounded preceding
                                    and current row)) users
from db.table

<强>输出

date        hour    users
2015-01-01  1       1
2015-01-01  1       1
2015-01-01  2       2
2015-01-01  7       3
2015-01-02  4       1
2015-01-02  4       1
2015-01-02  5       2
2015-01-03  1       1
2015-01-03  3       2
2015-01-03  4       3
2015-01-03  4       4

就性能而言,这需要 一个 MR作业。在这种情况下,进行自我左外联接是一场灾难。