несколько совпадений в регулярных выражениях в улье

#arrays #regex #hive #hiveql #ip-address

#массивы #регулярное выражение #улей #hiveql #ip-адрес

Вопрос:

Когда я запускаю

select regexp_extract("hosts: 192.168.1.1 192.168.1.2 host",'((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)',0);

Я получил 192.168.1.1 .
Но то, что я хочу, это 192.168.1.1,192.168.1.2 или ["192.168.1.1","192.168.1.2"]

Что мне делать, изменить reg или создать UDF?

Ответ №1:

Разделите строку, разнесите, проверьте каждую часть на соответствие регулярному выражению, соберите массив совпадающих частей, если необходимо получить строку из массива, используйте concat_ws() для объединения массива:

 with your_data as(
select stack(1, 'hosts: 192.168.1.1 192.168.1.2 host' ) as hosts
)

select collect_set(case when part rlike '((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)' 
                        then part 
                  else null end )
from your_data d
     lateral view explode(split(hosts, '  ')) s as part;
  

Результат:

 ["192.168.1.1","192.168.1.2"]
  

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

1. @billsteve Пожалуйста, подумайте о принятии ответа / голосования, если это действительно полезно