regex\u extract\u all:如何在多个列上执行正则表达式匹配

hivapdat  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(248)

我正在尝试对多个列执行正则表达式匹配。
以下是示例数据:
(dev=03,user=000,intip=138.40.13.24,extip=198.167.0.194,src\u port=1109,dest\u port=2613,response=6)(dev=03,user=000,intip=148.12.16.78,extip=168.67.0.10,src\u port=1460,dest\u port=3610,response=6)
预期产量:
(03,000,138.40.13.24,198.167.0.194,1109,2613,6)
(03,000,148.12.16.78,168.67.0.10,1460,3610,6)
剧本如下:

A = LOAD '---' using PigStorage as (value: chararray);

B = foreach A generate REGEX_EXTRACT_ALL('value', '(^.=(.)$)');

dump B;

输出:空白
()
()
()
如果我将使用脚本对单个列执行正则表达式匹配:

A = LOAD '---' using PigStorage as (dev: chararray, user:chararray, intip:chararray, extip:chararray, srcport:chararray, destport:chararray, response:chararray);

B = foreach A generate REGEX_EXTRACT(dev, '(^.=(.)$)');

dump B;

输出:
(03) (03)
有谁能告诉我,我犯了什么错误吗 REGEX_EXTRACT_ALL ?
期待回复,非常感谢您的帮助。

4smxwvx5

4smxwvx51#

旧线程,但我遇到它有同样的问题,所以它可能会帮助其他人
从第一个脚本开始,假设示例数据不是pig元组,而是原始输入:
pigstorage根据一个字符分隔符拆分为字段,需要处理逗号和圆括号,因此请改用textloader
你的模式不匹配。它应该是描述所有行的东西,括号“分组”你想要捕捉什么
flatten允许从regex\u extract\u all中创建一个元组
所以:

A = LOAD 'stack' using TextLoader as (line:chararray);

B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^\\(dev=(\\d{2}),user=(\\d{3}),intip=(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}),extip=(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}),src_port=(\\d{1,5}),dest_port=(\\d{1,5}),response=(\\d{1})\\)$'));

dump B

输出为
(03,000,138.40.13.24,198.167.0.194,1109,2613,6)
(03,000,148.12.16.78,168.67.0.10,1460,3610,6)

7xllpg7q

7xllpg7q2#

我有类似的问题,并发现Pig文件是混乱的。所以我发现:
regex\u extract和regex\u extract\u都有非常不同的匹配行为。

REGEX_EXTRACT(chararray source, chararray regex, int n)

在“source”中的任意位置搜索“regex”的发生次数regex“不需要包含任何用于生成输出的“()”regex不需要与整个source匹配。

REGEX_EXTRACT_ALL(chararray source, chararray regex)

只有“regex”匹配整个“source”时才有匹配项。与文档让您相信的相反,regex\u extract\u all不会重复匹配“source”上的“regex”,并将所有这些匹配作为元组返回。如果“regex”不包含“()”,则它不会返回任何内容。元组中返回的元素数是顶层“()”的数目。
因此:

(dev=03,user=000,intip=138.40.13.24,extip=198.167.0.194,src_port=1109,dest_port=2613,response=6) 

REGEX_EXTRACT_ALL(line, '(\\d+)')

不会匹配任何东西。

REGEX_EXTRACT_ALL(line, '\\(dev=(\\d+).*')

将返回(03)。

相关问题