Как сгруппировать по неделям Cloudera impala

Как сгруппировать результат запроса Impala по неделям? Данные выглядят так:

    userguid                 eventtime
0   66AB1405446C74F2992016E5 2014-08-01T16:43:05Z
1   66AB1405446C74F2992016E5 2014-08-02T20:12:12Z
2   4097483F53AB3C170A490D44 2014-08-03T18:08:50Z
3   4097483F53AB3C170A490D44 2014-08-04T18:10:08Z
4   4097483F53AB3C170A490D44 2014-08-05T18:14:51Z
5   4097483F53AB3C170A490D44 2014-08-06T18:15:29Z
6   4097483F53AB3C170A490D44 2014-08-07T18:17:15Z
7   4097483F53AB3C170A490D44 2014-08-08T18:18:09Z
8   4097483F53AB3C170A490D44 2014-08-09T18:18:18Z
9   4097483F53AB3C170A490D44 2014-08-10T18:23:30Z

Ожидаемый результат:

date                    count of different userguid
2014-08-01~2014-08-07   40
2014-08-08~2014-08-15   20
2014-08-16~2014-08-23   10

Спасибо.


person Linlin    schedule 01.09.2014    source источник


Ответы (2)


Если eventtime хранится как timestamp:

SELECT TRUNC(eventtime, "D"), COUNT(DISTINCT userguid)
FROM your_table
GROUP BY TRUNC(eventtime, "D")
ORDER BY TRUNC(eventtime, "D");

В противном случае, если eventtime хранится как string:

SELECT TRUNC(CAST(eventtime AS TIMESTAMP), "D"), COUNT(DISTINCT userguid)
FROM your_table
GROUP BY TRUNC(CAST(eventtime AS TIMESTAMP), "D")
ORDER BY TRUNC(CAST(eventtime AS TIMESTAMP), "D");

Для получения дополнительной информации о функции TRUNC см. Документация Cloudera Impala по функциям даты и времени.

person Jeff Hammerbacher    schedule 02.09.2014
comment
Можете пояснить ответ? Как это сделать для группировки с воскресенья по субботу следующей недели? - person MANU; 11.08.2016

В Impala TRUNC(timestamp, "D") означает нахождение начального дня недели. Вы можете ознакомиться с функциями даты и времени Impala здесь.

Например:

select trunc(cast('2016-11-10' as timestamp), "D")
+---------------------------------------------+
| trunc(cast('2016-11-10' as timestamp), 'd') |
+---------------------------------------------+
| 2016-11-07 00:00:00                         |
+---------------------------------------------+

+---------------------------------------------+
| trunc(cast('2016-11-09' as timestamp), 'd') |
+---------------------------------------------+
| 2016-11-07 00:00:00                         |
+---------------------------------------------+

+---------------------------------------------+
| trunc(cast('2016-11-11' as timestamp), 'd') |
+---------------------------------------------+
| 2016-11-07 00:00:00                         |
+---------------------------------------------+
person Yang Bryan    schedule 11.11.2016