我正在尝试对多个列执行正则表达式匹配。
以下是示例数据:
(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
?
期待回复,非常感谢您的帮助。
2条答案
按热度按时间4smxwvx51#
旧线程,但我遇到它有同样的问题,所以它可能会帮助其他人
从第一个脚本开始,假设示例数据不是pig元组,而是原始输入:
pigstorage根据一个字符分隔符拆分为字段,需要处理逗号和圆括号,因此请改用textloader
你的模式不匹配。它应该是描述所有行的东西,括号“分组”你想要捕捉什么
flatten允许从regex\u extract\u all中创建一个元组
所以:
输出为
(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)
7xllpg7q2#
我有类似的问题,并发现Pig文件是混乱的。所以我发现:
regex\u extract和regex\u extract\u都有非常不同的匹配行为。
在“source”中的任意位置搜索“regex”的发生次数regex“不需要包含任何用于生成输出的“()”regex不需要与整个source匹配。
只有“regex”匹配整个“source”时才有匹配项。与文档让您相信的相反,regex\u extract\u all不会重复匹配“source”上的“regex”,并将所有这些匹配作为元组返回。如果“regex”不包含“()”,则它不会返回任何内容。元组中返回的元素数是顶层“()”的数目。
因此:
不会匹配任何东西。
将返回(03)。