#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