Java 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 access”action=“pass”method=“GET”srcip=“10.20.7.210”dstip=“10.24.2.7”user=”“ad_domain=“”statuscode=“302”cached=“0”profile=“REF\u DefaultHTTPProfile(默认Web过滤器配置文件)”filteraction=“REF\u defaultHttpCf”(默认内容筛选器操作)“size=“0”request=“0x9ac68d0”url=”http://www.google.com“例外情况=“av、auth、内容、url、ssl、certcheck、certdate、mime、缓存、文件扩展名”error=”“authtime=“0”dnstime=“1”cattime=“0”avscantime=“0”fullreqtime=“239428”device=“0”auth=“0” 因此,我设法用MapReduce在Java中实现了这一点,使用以下正则表达式:Java PIG中带双引号的正则表达式,java,regex,hadoop,mapreduce,apache-pig,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 access”action=“pass”method=“GET”srcip=“10.20.7.210”dstip=“10.24.2.7”user=”“ad_domain=“”statuscode=“30
\”([^\“]*)\“
获取引号之间的值,然后对其进行处理。现在我想用pig实现同样的操作,但我无法将正则表达式应用于每一行
我正在做:
input = load './http.log' as (line : chararray);
splt = foreach input generate FLATTEN(REGEX_EXTRACT_ALL(line,'(\\"([^\\"]*)\\")'));
dump splt;
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;
转储的结果是:()
我在使用REGEX_EXTRACT_ALL时遗漏了一些东西,或者我必须以不同的方式转义REGEX的某些字符
谢谢!我用不同的方法提取了值,因为我只需要行中的一些字段 为了获得我正在做的值:
input = load './http.log' as (line : chararray);
splt = foreach input generate FLATTEN(REGEX_EXTRACT_ALL(line,'(\\"([^\\"]*)\\")'));
dump splt;
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;
然后我可以继续脚本的其余部分。双引号在正则表达式中没有什么特殊之处,不需要引用它们;在Java中这样做只是因为在字符串文本中,必须引用它们。但是,既然PIG似乎不需要这些,只需删除反斜杠。@fge我需要正则表达式的方式是:
\([^\“]*)\”
为了获得引号之间的所有值,如下所示:。但是如果我不替换\,我会在执行pig脚本时得到:意外字符''