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

#sql #regex #hive #hiveql #cloudera

Вопрос:

У меня есть строковая переменная, хранящаяся в hive следующем

 stringvar AA1,BB3,CD4 AA12,XJ5  

Я хотел бы посчитать (и отфильтровать), сколько раз wwd встречается шаблон регулярного выражения. В приведенном примере в первом ряду, очевидно, есть три таких примера. Как я могу это сделать, не прибегая к боковым обзорам и взрывам stringvar (слишком дорого)?

Спасибо!

Ответ №1:

Вы можете разделить строку по шаблону и рассчитать размер результирующего массива — 1.

ДЕМОНСТРАЦИЯ:

 select size(split('AA1,BB3,CD4','\w\w\d'))-1 --returns 3 select size(split('AA12,XJ5','\w\w\d'))-1 --returns 2 select size(split('AAxx,XJx','\w\w\d'))-1 --returns 0 select size(split('','\w\w\d'))-1 --returns 0  

Если столбец может быть пустым, следует проявлять особую осторожность. Например, вот так (зависит от того, что вам нужно вернуть в случае NULL):

 select case when col is null then 0  else size(split(col,'\w\w\d'))-1   end  

Или просто преобразуйте NULL в пустую строку с помощью функции NVL:

 select size(split(NVL(col,''),'\w\w\d'))-1   

Приведенное выше решение является наиболее гибким, вы можете подсчитать количество вхождений и использовать его для сложной фильтрации/объединения/и т.д.

В случае, если вам просто нужно отфильтровать записи с фиксированным числом вхождений шаблонов или, по крайней мере, с фиксированным числом, и вам не нужно знать точное количество, тогда простой RLIKE без разделения-самый дешевый метод.

Например, проверьте наличие как минимум 2 повторов:

 select 'AA1,BB3,CD4' rlike('\w\w\d ,\w\w\d ') --returns true, can be used in WHERE