2015-07-09 4 views
1

Привет, есть ли способ подсчитать количество запусков, отличное от HIVE?Улей: расчетный пробег DISTINCT

У меня есть кадр данных, который содержит дату и часы и идентификатор людей, которые в настоящее время посещают веб-сайт.

Что я хотел бы сделать, так это знать «кумулятивный» счет, отличный от деления на .

Я не могу использовать группу по дате, часу, счету (отдельный идентификатор), потому что если игрок активен в 1 и 2, он будет засчитан дважды.

Есть ли способ сделать это, используя аналитику улья и окна?

Я пробовал:

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

Я думаю, что вам лучше присоединиться к делу с заявлением.

Тогда вы можете сделать легко следующее:

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 
; 

Это при условии, дата строка сопоставимыми. Вы можете сделать это следующим образом и считая, что ваши даты являются довольно недавними, поэтому строка имеет одинаковый размер. В противном случае вам, возможно, придется привязать строку нулями. Смотрите ниже:

Если предположить, что дата и время, как гггг-ММ-дд и чч: мм: сс, а затем преобразовать дату и время unix_time_stamp так:

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

благодарит за ваш ответ! но я хотел бы сделать это с помощью функции окна .. и хотел бы знать, почему мой синтаксис неверен? – lucacerone

+0

Я думаю, что это потому, что для оконных функций требуется агрегатная функция. Использование count (dinstinct (column)) over (...) обертывает функцию агрегации вокруг отдельного оператора. Разный оператор не является функцией aggegation, поэтому неопределенный (столбец) над (...) терпит неудачу. Удачи lucacerone! :) – invoketheshell

0

Интуиция пятно на, Улей просто не нравится считать разные функции окон. Обходной путь собирает в набор и затем принимает размер каждого массива над окном. Я сделал некоторые случайные данные, чтобы убедиться, что это то, что вы хотите. Допустим, у вас

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 работу. Выполнение самостоятельного левого внешнего соединения - катастрофа в этой ситуации.