как пометить одну строку и сохранить ее конкретное значение в Hive, используя стандартный запрос или UDF?

Мне нужно написать запрос в Hive или определить функцию, которая должна делать следующее:

Набор данных:

Student || Time    || ComuputerPool
-------------------------------------
  A     ||  9:15AM ||  Pool1.Machine2
-------------------------------------
  A     ||  9:45AM ||  Pool1.Machine7
-------------------------------------
  A     ||  10:15AM||  Pool1.Machine9
-------------------------------------
  A     ||  11:00AM||  Pool2.Machine2
-------------------------------------
  A     ||  12:05  ||  Pool2.Machine3
-------------------------------------
  A     ||  12:40  ||  Pool3.Machine5
------------------------------------- 
  A     ||  13:10  ||  Pool1.Machine3
-------------------------------------
  A     ||  13:50  ||  Pool1.Machine10
-------------------------------------
  B   ..........................

поэтому теперь запрос должен выяснить, сколько времени конкретный учащийся провел в конкретном пуле компьютеров, вычислив разницу между тем, когда он впервые использовал машину в пуле и когда он впервые начал использовать машину в другом пуле. Таким образом, в этом примере время, которое он потратил, будет разницей: 11:00 - 9:15 = 1 час 45 минут.

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


person Dilshad Abduwali    schedule 29.05.2015    source источник
comment
Ваш вопрос явно касается Hive, поэтому я удалил тег mysql.   -  person Gordon Linoff    schedule 29.05.2015


Ответы (1)


Hive поддерживает row_number(), поэтому вы можете использовать трюк для группировки последовательных значений. Разница между номерами двух строк определяет группу, которую затем можно использовать для агрегирования. Результирующий запрос выглядит так:

select student, grp, min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, computerpool order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, computerpool;

РЕДАКТИРОВАТЬ:

Ваш вопрос касается пулов, а не машин. Таким образом, вы, по-видимому, заботитесь только о той части, которая предшествует периоду. (Кстати, вы должны хранить эту информацию в отдельных столбцах).

select student, substr(computerpool, 1, 6), min(time), max(time)
from (select t.*,
             (row_number() over (partition by student order by time) -
              row_number() over (partition by student, substr(computerpool, 1, 6) order by time)
             ) as grp
      from dataset t
     ) t
group by student, grp, substr(computerpool, 1, 6);
person Gordon Linoff    schedule 29.05.2015
comment
его группировка по пулам, даже если они были в разное время, потому что он должен рассматривать пул как другой, как только он арендует его, и рассматривать следующее посещение как новую группу - person Dilshad Abduwali; 30.05.2015
comment
@dhssa . . . Я думаю, что это то, что делает этот запрос. - person Gordon Linoff; 30.05.2015
comment
Я запустил его, и он сгруппировал пулы в одну группу независимо от временных рамок и пронумеровал их от 1, 2,.... Ожидается: 1.посещение Pool1 с номерами 1,2,.. и повторное посещение Pool1 снова с 1, 2,... - person Dilshad Abduwali; 30.05.2015
comment
вопрос отредактирован: добавлены две дополнительные строки, поэтому запрос не должен группировать первый Pool1 и второй Pool1 или не должен нумеровать их все вместе, а отдельно - person Dilshad Abduwali; 30.05.2015