我正在编写一个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时我会遗漏一些东西,或者我必须以不同的方式逃避正则表达式的某些字符?
谢谢!
答案 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;
然后我可以继续使用脚本的其余部分