1

我正在尝试对多个列执行正则表达式匹配。

这是示例数据:

(dev=03,user=000,intip=138.40.13.24,extip=198.167.0.194,src_port=1109,dest_port=2613,response=6) (dev=03,user=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

期待回复,非常感谢您的帮助。

4

2 回答 2

1

旧线程,但我遇到了同样的问题,所以它可能会帮助其他人

从第一个脚本开始并假设您的示例数据不是猪元组而是原始输入:

  1. PigStorage 基于单字符分隔符拆分为字段,您需要处理逗号和括号,因此请改用 TextLoader

  2. 你的模式不匹配。它应该是描述所有行的东西,括号“分组”你想要捕捉的东西

  3. 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)

于 2015-02-01T11:36:21.923 回答
1

我有类似的问题,发现 Pig 文档令人困惑。所以这是我发现的:
REGEX_EXTRACT 和 REGEX_EXTRACT_ALL 具有非常不同的匹配行为。

REGEX_EXTRACT(chararray source, chararray regex, int n) 

搜索“源”中任何地方出现的“正则表达式”。'regex' 不需要包含任何 '()' 来生成输出。'regex' 不需要匹配整个 'source'。

REGEX_EXTRACT_ALL(chararray source, chararray regex)

只有当 'regex' 匹配整个 'source' 时才会匹配。与文档会让您相信的相反,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)。

于 2015-03-04T20:03:39.207 回答