在PIG中使用双引号的正则表达式

时间:2015-02-02 19:35:28

标签: java regex hadoop mapreduce apache-pig

我正在编写一个pig脚本来处理来自sophos代理的访问日志。

每一行都是:

  

2015:01:13-00:00:01 AR-BADC-FAST-01 httpproxy [27983]:id =“0001”severity =“info”sys =“SecureWeb”sub =“http”name =“http访问“action =”pass“method =”GET“srcip =”10.20.7.210“dstip =”10.24.2.7“user =”“ad_domain =”“statuscode =”302“cached =”0“profile =”REF_DefaultHTTPProfile(默认Web Filter Profile)“filteraction =”REF_DefaultHTTPCFFAction(默认内容过滤器操作)“size =”0“request =”0x9ac68d0“url =”http://www.google.com“exceptions =”av,auth,content,url, ssl,certcheck,certdate,mime,cache,fileextension“error =”“authtime =”0“dnstime =”1“cattime =”0“avscantime =”0“fullreqtime =”239428“device =”0“auth =”0 “

所以我设法用MapReduce在Java中完成,使用以下正则表达式:\"([^\"]*)\"来获取引号之间的值,然后处理它。现在我想对猪做同样的事,但是我无法将正则表达式应用到每一行。

我在做:

input = load './http.log' as (line : chararray);
splt = foreach input generate FLATTEN(REGEX_EXTRACT_ALL(line,'(\\"([^\\"]*)\\")'));
dump splt;

转储的结果是:()。

使用REGEX_EXTRACT_ALL时我会遗漏一些东西,或者我必须以不同的方式逃避正则表达式的某些字符?

谢谢!

1 个答案:

答案 0 :(得分:0)

我设法用不同的方法提取值,因为我只想要一行的某些字段。

为了获得我正在做的值:

splt = FOREACH A GENERATE
    FLATTEN(REGEX_EXTRACT(line,'.*url="([^"]*)".*',1)) AS url,
    FLATTEN(REGEX_EXTRACT(line,'.*fullreqtime="([^"]*)".*',1)) AS duration,
    FLATTEN(REGEX_EXTRACT(line,'.*size="([^"]*)".*',1)) AS bytes;

然后我可以继续使用脚本的其余部分