как разделить данные на почасовую, основываясь на отметке времени начала и окончания - PullRequest
0 голосов
/ 06 апреля 2020

Мои исходные данные, как показано ниже

id      start_time              end_time
abc123  2022-07-03 12:00:00.0   2022-07-04 01:59:00.0
abc1234 2022-07-03 12:00:00.0   2022-07-04 01:59:00.0
abc123A 2022-07-03 13:00:00.0   2022-07-03 14:59:00.0

, как записать sql, чтобы получить результат ниже в улье. Я ожидаю, что sql должно быть динамически c, поскольку существует огромное количество данных

datetime              Count
2022-07-03 12:00:00   2
2022-07-03 13:00:00   3
2022-07-03 14:00:00   3
2022-07-03 15:00:00   2
2022-07-03 16:00:00   2
2022-07-03 17:00:00   2
2022-07-03 18:00:00   2
2022-07-03 19:00:00   2
2022-07-03 20:00:00   2
2022-07-03 21:00:00   2
2022-07-03 22:00:00   2
2022-07-03 23:00:00   2
2022-07-04 00:00:00   2
2022-07-04 01:00:00   2

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

В Hive есть хитрость для генерации серии чисел - и их можно затем превратить в даты. Это боль, но есть хитрость, использующая space() и posexplode() - которая адаптирована из здесь .

Я не уверен, что синтаксис правильный на 100% , но как то так:

with hh as (
      select unix_timestamp(min(start_time)) + (n - 1) * 60*60 as hh_start,
             unix_timestamp(min(start_time)) + n * 60*60 as hh_end
      from (select unix_timestamp(min(start_time)) as min_st,
                   floor((unix_timestamp(max(end_time)) - unix_timestamp(min(start_time))) / (60 * 60)) as num_hours
            from t
           ) x lateral view
           posexplode(split(space(num_hours + 1), ' ')) pe as n, x
     )
select hh.hh_start, count(t.id)
from hh left join
     t
     on t.start_time < hh.hh_end and
        t.end_time >= hh.hh_start
group by hh.hh_start
order by h.hh_start;
0 голосов
/ 06 апреля 2020

Выполнение соединения неравенства с измерением дало мне ожидаемое o / p

Dimension
+-------------------+
|start_time         |
+-------------------+
|2020-03-31 12:00:00|
|2020-03-31 13:00:00|
|2020-03-31 14:00:00|
|2020-03-31 15:00:00|
|2020-03-31 16:00:00|
|2020-03-31 17:00:00|
|2020-03-31 18:00:00|
|2020-03-31 19:00:00|
|2020-03-31 20:00:00|
|2020-03-31 21:00:00|
|2020-03-31 22:00:00|
|2020-03-31 23:00:00|
|2020-04-01 00:00:00|
|2020-04-01 01:00:00|
|2020-04-01 02:00:00|
|2020-04-01 03:00:00|
+-------------------+

Условие соединения

tab.start_time <= dim.start_time and tab.end_time > dim.start_time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...