Улей как выбирать записи по появлению ключевых терминов и максимальному времени - PullRequest
0 голосов
/ 14 февраля 2020

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

1 - df1:

id1  id2  name                                 time
1     1    xxxLOAD_TIME                          1
1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx        2
1     1    xxxxSome other timexxxx               3
2     2    xxSome other timex                    1
3     1    xxxLOAD_TIME                          1
3     1    xxSome other timexx                   2

2 - После создания b_flag (порядок столбцов значения не имеет) должно выглядеть следующим образом. B_flag указывает на появление LOGIN_SESSION и LOAD_TIME в группах id1 + id2:

id1  id2  name                             b_flag   time
1     1    xxxLOAD_TIME                      1       1
1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx    1       2
1     1    xxxxSome other timexxxx                   3
2     2    xxSome other timex                        1
3     1    xxxLOAD_TIME                      1       1
3     1    xxSome other timexx                       2

3 - Фильтр по b_flag

id1  id2  name                             b_flag   time
1     1    xxxLOAD_TIME                      1       1
1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx    1       2
1     1    xxxxSome other timexxxx                   3
3     1    xxxLOAD_TIME                      1       1
3     1    xxSome other timexx                       2

4 - Желаемый вывод (фильтр по максимальному времени):

   id1  id2  name                             b_flag   time
    1     1    xxxxSome other timexxxx                  3
    3     1    xxSome other timexx                      2

Ниже приведен мой попытанный код:

create table num1 as
select * 
   from (
   select t.*, sum(b_flag) over(partition by id1,id2) as sum_b_flag,
   max(time) over (partition by id1,id2) max_time,
   ROW_NUMBER() OVER (PARTITION BY id1,id2) as rn /*ensure no duplicates*/
   from (
        select
           t.*,
           case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end b_flag
        from df1 as t
        ) t
) t

where sum_b_flag > 0 AND name like '%TIME' AND time = max_time AND t.rn = 1

Этот код генерирует следующую ошибку, возможно, указывает на нехватку памяти:

ОШИБКА: Ошибка выполнения: ошибка во время обработки оператора: FAILED: ошибка выполнения, код возврата 2 из org. apache .had oop .hive.ql.exe c .tez.TezTask. Ошибка вершины, vertexName = Reducer 2, vertexId = vertex_1581665816621_0012_183_01, диагностика = [Задача не выполнена, taskId = task_1581665816621_0012_183_01_000006, диагностика = [TaskAttempt 0 не пройдена, информация = [ошибка: ошибка * при выполнении задачи 0166166166166166166166166166166166166166166166166_166_165_166_126_166_166_166_165_166_166_166_166_165_165_16). = 0 RuntimeException: java .lang.RuntimeException: org. apache .had oop .hive.ql.metadata.HiveException: Ошибка времени выполнения Hive при обработке строки в org. apache .had oop .hive.ql .exe c .tez.TezProcessor.initializeAndRunProcessor (TezProcessor. java: 296) в org. apache .had oop .hive.ql.exe c .tez.TezProcessor.run (TezProcessor. java: 250) в орг. apache .tez.runtime.LogicalIOProcessorRuntimeTask.run (LogicalIOProcessorRuntimeTask. java: 374) в орг. *: 73) в орг. .SU bject.doAs (Subject. java: 422) в орг. apache .had oop .security.UserGroupInformation.doAs (UserGroupInformation. java: 1730) в ......

...