2011-03-14 47 views
1

我正在分析AWS CloudFront访问日志。Apache Pig:来自Web日志的额外查询参数

我的代码加载文件的

raw_logs2 =LOAD 'file:///home/ec2-user/ENWRZAC68E00M.2011-02-28-18.72jA8eGh' 
    USING PigStorage('\t') 
    AS (
    date: chararray, time: chararray, x_edge_location: chararray, sc_bytes: int, 
    c_ip: chararray, cs_method: chararray, cs_host: chararray, cs_uri_stem: chararray, 
    sc_status: chararray, cs_referer: chararray, cs_user_agent:chararray, cs_uri_query: chararray 
); 

现在我试图解析查询字符串参数(名称/值对)线路:

p=searchresults&s=homesforsale&gad=&gci=FOUNTAIN%2520VALLEY&gst=CA&gzi=&k=fountainvalleyca&ts=1298918206& 

如何添加额外的列到我的raw_logs2表中查询字符串中的p,s和gci的值?

回答

2

一个快速的方法来做到这一点是使用REGEX_EXTRACT_ALL

raw_logs = 
    GENERATE 
    *, 
    FLATTEN(REGEX_EXTRACT_ALL(cs_uri_query, 'p=(.+?)&s=(.+?)&.+?gci=(.+?)&.+?')) 
     AS (p:CHARARRAY, s:CHARARRAY, gci:CHARARRAY);` 
+0

感谢您的答复罗曼。我扩大在样品上,并得到这样的:??? 'code' raw_logs = GENERATE *, FLATTEN(REGEX_EXTRACT_ALL(cs_uri_query,“P =(+)&S =(+)&W =(+)&H =(。+?)&广告=(。+?)&GAD =(。+?)&GCI =(。+?)&GST =(。+?)&GZI =(。+?)&千瓦=(。+?)。 +)')) AS(p:CHARARRAY,s:CHARARRAY,w:CHARARRAY,h:CHARARRAY,ad:CHARARRAY,gad:CHARARRAY,gci:CHARARRAY,gst:CHARARRAY,gzi:CHARARRAY,kw:CHARARRAY);'/code' 我正在使用猪0.6.0,并得到一个错误,它得到了生成,并期望别的东西。当我从我的日志文件中加载raw_logs2时,调用如何知道cs_uri_query来自哪里。 – 2011-03-21 17:26:10

+0

我更新到0.8.0,并做了修改,在它之前添加了一个FOREACH,它效果很好。谢谢。 – 2011-03-21 18:33:58