Hive [Ошибка 10025]: выражение отсутствует в имени ключа GROUP BY - PullRequest
0 голосов
/ 15 января 2020

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

name - это строка с ключевыми терминами, которые интересуют.

группы определяются сочетанием из id1 и id2.

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

select id1, id2, name
   case
    when name LIKE '%LOAD_TIME' then 1
    when name LIKE '%LOGIN_SESSION_TIME' then 1
   end as b_flag
   from df1
   group by id1, id2
   having (sum(b_flag) > 0 )

df1:

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

После создания b_flag новый набор данных должен выглядеть следующим образом:

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

Требуемый вывод:

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

Я не вижу, что не так с моим кодом, но я получаю ту же ошибку:

[Ошибка 10025]: Выражение отсутствует в имени ключа GROUP BY

Спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 15 января 2020

Попробуйте

select 
    main.id1, 
    main.id2, 
    main.name,
    case
        when main.name LIKE '%LOAD_TIME' then 1
        when main.name LIKE '%LOGIN_SESSION_TIME' then 1
    end as b_flag
from 
    df1 main
    left semi join (
        select distinct id1, id2 from df1 
        where (case
            when name LIKE '%LOAD_TIME' then 1
            when name LIKE '%LOGIN_SESSION_TIME' then 1
        end)=1 ) f 
on main.id1=f.id1 and main.id2=f.id2
1 голос
/ 15 января 2020

Вы можете сделать это с помощью оконных функций:

select id1, id2, name, b_flag
from (
    select 
        t.*, 
        case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end b_flag,
        sum(case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end) 
            over(partition by id1, id2) sum_b_flag
    from mytable t
) t
where sum_b_flag > 0

Внутренний запрос проверяет, соответствует ли текущая строка критериям, и вычисляет сумму окна для флага над записями, имеющими тот же (id1, id2).

Если вы не хотите повторять выражение, которое вычисляет флаг, вы можете использовать дополнительный подзапрос:

select id1, id2, name, b_flag
from (
    select t.*, sum(b_flag) over(partition by id1, id2) sum_b_flag
    from (
        select 
            t.*, 
            case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end b_flag,
        from mytable t
    ) t
) t
where sum_b_flag > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...