【问题标题】:Regex with double quotes in PIGPIG中带双引号的正则表达式
【发布时间】: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


【解决方案1】:

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

为了得到我正在做的值:

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;

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

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多