REGEX_EXTRACT_ALL:如何在多个列上执行正则表达式匹配

时间:2013-08-29 13:29:48

标签: apache-pig

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

以下是样本数据:

  

(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中的任何错误?

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

2 个答案:

答案 0 :(得分:1)

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

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

  1. PigStorage基于单字符分隔符拆分为字段,您可以使用逗号和括号进行处理,因此请使用TextLoader

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

  3. FLATTEN允许从REGEX_EXTRACT_ALL中创建一个元组

  4. 所以:

    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)。