我正在尝试在多个列上执行正则表达式匹配。
以下是样本数据:
(DEV = 03,用户= 000,intip = 138.40.13.24,extip = 198.167.0.194,src_port = 1109,dest_port = 2613,响应= 6) (DEV = 03,用户= 000,intip = 148.12.16.78,extip = 168.67.0.10,src_port = 1460,dest_port = 3610,响应= 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
中的任何错误?
期待回复,非常感谢您的帮助。
答案 0 :(得分:1)
旧线程,但我遇到了同样的问题,所以它可能会帮助其他人
从第一个脚本开始,假设您的样本数据不是猪元组,而是原始输入:
PigStorage基于单字符分隔符拆分为字段,您可以使用逗号和括号进行处理,因此请使用TextLoader
你的模式不匹配。它应该是描述所有行的内容,括号“分组”你想要捕获的内容
FLATTEN允许从REGEX_EXTRACT_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)
答案 1 :(得分:1)
我有类似的问题,发现猪文档令人困惑。所以这就是我发现的:
REGEX_EXTRACT和REGEX_EXTRACT_ALL具有非常不同的匹配行为。
REGEX_EXTRACT(chararray source, chararray regex, int n)
搜索' regex'任何地方的来源'。 '正则表达式'不需要包含任何'()'用于生成输出。 '正则表达式'不需要匹配整个来源'。
REGEX_EXTRACT_ALL(chararray source, chararray regex)
如果'正则表达式' 只会匹配匹配整个'来源'。与文档使您相信的内容相反,REGEX_EXTRACT_ALL不会重复匹配正则表达式'关于来源'并将所有这些匹配作为元组返回。如果' 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)。