嗨,有没有办法计算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
但它会引发错误。
答案 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作业。在这种情况下,进行自我左外联接是一场灾难。