СЛУЧАЙ, КОГДА ПОДОБНОЕ РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ в улье Hadoop

#regex #hadoop #hive #case #rlike

#регулярное выражение #hadoop #улей #случай #rlike

Вопрос:

Я хочу написать запрос в таблице hive, используя CASE WHEN, LIKE и регулярное выражение. Я использовал regexp и rlike , но я не получаю желаемых результатов. Мои попытки до сих пор следующие

     select distinct ending from
(select date, ending, name, count(distinct id) 
from (select CONCAT_WS("/",year,month,day,hour) as date, id, name,
case when type = 'TRAN' then 'tran'
when events regexp '%[:]no_reply[:]%[^o][^n][:]incomplete[:]%' and type rlike '%HUP' then 'con'
when events not regexp '%[:]no_reply[:]%[^o][^n][:]incomplete[:]%' and type rlike '%HUP'  then 'aban'
else 'other'
end as ending
from data_struct1) tmp
group by date, ending, name) tmp2;
 

а также

 select distinct ending from
    (select date, ending, name, count(distinct id) 
    from (select CONCAT_WS("/",year,month,day,hour) as date, id, name,
    case when type = 'TRAN' then 'tran'
    when events rlike '%[:]no_reply[:]%[^o][^n][:]incomplete[:]%' and type rlike '%HUP' then 'con'
    when events not rlike '%[:]no_reply[:]%[^o][^n][:]incomplete[:]%' and type rlike '%HUP'  then 'aban'
    else 'other'
    end as ending
    from data_struct1) tmp
    group by date, ending, name) tmp2;
 

Оба запроса возвращают неправильные результаты (неплохой синтаксис, просто неправильные результаты).

Комментарии:

1. что вы пытаетесь сделать, пожалуйста, опишите, регулярное выражение определенно неверно. Что должно делать это ‘%[:] no_reply[:]% [^ o] [^ n] [:] неполный [:]%’?

2. регулярное выражение выглядит следующим образом: ':no_reply:[^:]*:incomplete::'

3. Просто скажите, что он должен делать. Ваше регулярное выражение снова кажется неправильным. Раньше вы не обращали внимания на косую : черту, но я не уверен, что на самом деле должно делать регулярное выражение. Предоставьте пример строки, если это возможно

4. В этой строке: opencase_2,initial_state:inquiry,inquiry:no_reply:initial_state:incomplete::,inquiry:reask:secondary_state:complete:: мне нужно проверить, есть ли у меня следующая подстрока: no_reply:initial_state:incomplete , однако строка в середине initial_state может варьироваться между множеством значений (300 разных, что означает, что я не могу написать исчерпывающие условия if).

Ответ №1:

Существует множество документов по квантификаторам регулярных выражений, например, этот: https://docs.microsoft.com/en-us/dotnet/standard/base-types/quantifiers-in-regular-expressions

 select 'opencase_2,initial_state:inquiry,inquiry:no_reply:initial_state:incomplete::,inquiry:reask:secondary_state:complete::' regexp 'no_reply:[^:] :incomplete';

OK
true
 

Также это неправильно: rlike '%HUP' . Это должно быть так '.*HUP$' (в конце строки) или просто «HUP», если не имеет значения, где находится HUP: в середине, в конце или в начале строки

rlike и regexp в вашем запросе работает то же самое, лучше использовать тот же оператор: только regexp или rlike. Эти два являются синонимами.

Тест: https://regex101.com/r/ksG67v/1