2011-03-14 3 views
1

Je travaille sur l'analyse des journaux d'accès AWS CloudFront.Apache Pig: paramètres de requête supplémentaires à partir du journal Web

J'ai le code pour charger les lignes du fichier

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 
); 

Maintenant, je suis en train d'analyser les paramètres de chaîne de requête (paires nom/valeur):

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

Comment puis-je ajouter une colonne supplémentaire à ma table raw_logs2 pour les valeurs de p, s et gci dans la chaîne de requête?

Répondre

2

Un moyen rapide de le faire est d'utiliser REGEX_EXTRACT_ALL:

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

Merci pour la réponse Romain. J'ai développé sur l'échantillon et j'ai obtenu ceci: 'code' raw_logs = GÉNÉRER *, FLATTEN (REGEX_EXTRACT_ALL (cs_uri_query, 'p = (. +?) & S = (. +?) & W = (. +?) & H = (. +?) & ad = (. +?) & gad = (. +?) & gci = (. +?) & gst = (. +?) & gzi = (. +?) & kw = (. +?) &. +? ')) AS (p: CHARARRAY, s: CHARARRAY, w: CHARARRAY, h: CHARARRAY, annonce: CHARARRAY, gad: CHARARRAY, gci: CHARARRAY, gst: CHARARRAY, gzi: CHARARRAY, kw: CHARARRAY); '/code' J'utilise pig 0.6.0 et j'obtiens une erreur qu'il a généré et il s'attendait à autre chose. Comment l'appel sait-il que cs_uri_query est arrivé lorsque j'ai chargé raw_logs2 de mon fichier journal? –

+0

J'ai mis à jour à 0.8.0 et ai fait le changement pour ajouter un FOREACH avant cela et cela fonctionne très bien. Merci. –

Questions connexes