在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.2 10.199.44.111 10.58.3.142169.254.2.12 10.58.3.142 192.168.0.1192.100.0.2154.16.171.3 192.10.0.2154.161.71.3