【发布时间】:2015-02-02 19:35:27
【问题描述】:
我正在编写一个 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_DefaultHTTPProfile (默认Web 过滤器配置文件)" 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 中使用以下正则表达式:\"([^\"]*)\" 获取引号之间的值,然后对其进行处理。现在我想对 pig 做同样的事情,但我无法将正则表达式应用于每一行。
我在做:
input = load './http.log' as (line : chararray);
splt = foreach input generate FLATTEN(REGEX_EXTRACT_ALL(line,'(\\"([^\\"]*)\\")'));
dump splt;
转储的结果是:()。
我在使用 REGEX_EXTRACT_ALL 时遗漏了什么,或者我必须以不同的方式转义正则表达式的某些字符?
谢谢!
【问题讨论】:
-
双引号在正则表达式中没什么特别的,不需要引用;您必须在 Java 中这样做,因为在字符串文字中,您必须引用它们。但既然 PIG 似乎不需要它,只需删除反斜杠即可。
-
@fge 我需要这样的正则表达式:
\"([^\"]*)\"以便获取引号之间的所有值,如下所示:regex101.com/r/yF8xN8/1。但如果我不转义 \,我会得到:Unexpected character '"'执行猪脚本时
标签: java regex hadoop mapreduce apache-pig