Impala/Hive-从逗号分隔的字符串中提取文本,其中每个分隔符与模式不匹配



在hive或impala中有没有一种方法可以从分隔字符串中提取字符串,但只能在我想要的字符串与一个或多个模式不匹配的地方提取?

例如,我有一个包含IP的字段(数量因网络适配器而异(:

169.254.182.175,192.168.0.1,10.199.44.111

我想提取不是以169.254开头的IP。(可能有很多(并且不等于192.168.0.1

IP也可以是任何顺序。

我试着用嵌套的大小写substr,但由于字符串中的ips数量未知,它没有成功。

这可以用regex_extract或类似的东西来完成吗?

谢谢,

您可以将regexp_replace与捕获组一起用于您不想保留的模式,并在替换字符串中仅指定感兴趣的组。

参见Impala(impalad版本3.4.0(中的以下示例:

select
addr_list,
/*Concat is used just for visualization*/
rtrim(ltrim(regexp_replace(addr_list,concat(
/*Group of 169.254.*.* that should be excluded*/
'(169\.254\.\d{1,3}\.\d{1,3})', '|',
/*Another group for 192.168.0.1*/
'(192.168.0.1)', '|',
/*And the group that we need to keep*/
'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'

/*So keep the third group in the output.
Other groups will be replaced with empty string*/
), '\3'), ','), ',') as ip_whitelist
from(values
('169.254.182.175,192.168.0.1,169.254.2.12,10.199.44.111,169.254.0.2' as addr_list),
('10.58.3.142,169.254.2.12'),
('192.168.0.1,192.100.0.2,154.16.171.3')
) as t
地址列表169.254.182.175192.168.0.1169.254.2.12,10.199.44.111169.254.0.210.199.44.11110.58.3.142169.254.2.1210.58.3.142192.168.0.1192.100.0.2154.16.171.3192.10.0.2154.161.71.3

最新更新