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

2o7dmzc5  于 2022-09-27  发布在  Impala
关注(0)|答案(1)|浏览(315)

在hive或impala中,是否有一种方法可以从分隔字符串中提取字符串,但只能在我想要的字符串与一个或多个模式不匹配的情况下提取?
例如,我有一个IP字段(数量因网络适配器而异):

169.254.182.175,192.168.0.1,10.199.44.111

我想提取不以169.254开头的IP。(可能有很多)并且不等于192.168.0.1
IP也可以是任何顺序。
我试着用嵌套的case来做substr,但由于字符串中的ip数未知,所以没有成功。
这可以用regex_extract或类似的东西来实现吗?
谢谢

puruo6ea

puruo6ea1#

对于不想保留的模式,可以将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
addr_listip_whitelist(白名单)
169.254.182.175,192.168.0.1,169.254.2.12,10.199.44.111,169.254.0.210.199.44.111
10.58.3.142,169.254.2.1210.58.3.142
192.168.0.1,192.100.0.2,154.16.171.3192.100.0.2,154.16.171.3

由于未知原因,e1d1e的工作方式不同,因为对于情况1和3,使用3作为返回组的同一regex根本不会返回任何内容。

select
  t.addr_list,
  rtrim(ltrim(regexp_replace(addr_list, r.regex, '\\3'), ','), ',') as ip_whitelist,
  regexp_extract(addr_list, r.regex, 3) as ip_wl_extract
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
  cross join (
    select concat(
      '(169\\.254\\.\\d{1,3}\\.\\d{1,3})', '|',
      '(192\.168\.0\.1)', '|',
      '(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})'
    ) as regex
  ) as r
addr_listip_whitelistip_wl_extract
169.254.182.175,192.168.0.1,169.254.2.12,10.199.44.111,169.254.0.210.199.44.111
10.58.3.142,169.254.2.1210.58.3.14210.58.3.142
192.168.0.1,192.100.0.2,154.16.171.3192.100.0.2,154.16.171.3

相关问题