Apache Pig: дополнительные параметры запроса из веб-журнала

Я работаю над анализом журналов доступа к AWS CloudFront.

У меня есть код для загрузки строк файла

    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 в строке запроса?


person Jason Webber    schedule 14.03.2011    source источник


Ответы (1)


Один из быстрых способов сделать это — использовать REGEX_EXTRACT_ALL:

raw_logs = 
  GENERATE
    *, 
    FLATTEN(REGEX_EXTRACT_ALL(cs_uri_query, 'p=(.+?)&s=(.+?)&.+?gci=(.+?)&.+?')) 
      AS (p:CHARARRAY, s:CHARARRAY, gci:CHARARRAY);`
person Romain    schedule 15.03.2011
comment
Спасибо за ответ Роман. Я расширил образец и получил следующее: code raw_logs = GENERATE *, FLATTEN(REGEX_EXTRACT_ALL(cs_uri_query, 'p=(.+?)&s=(.+?)&w=(.+?)&h=(.+?) &ad=(.+?)&gad=(.+?)&gci=(.+?)&gst=(.+?)&gzi=(.+?)&kw=(.+?)&.+?')) КАК (p:CHARARRAY, s:CHARARRAY, w:CHARARRAY, h:CHARARRAY, ad:CHARARRAY, gad:CHARARRAY, gci:CHARARRAY, gst:CHARARRAY, gzi:CHARARRAY, kw:CHARARRAY);/code Я использую pig 0.6.0 и получить ошибку, которую он сгенерировал, и ожидал чего-то другого. Как вызов узнает, что cs_uri_query пришел, когда я загрузил raw_logs2 из моего файла журнала. - person Jason Webber; 21.03.2011
comment
Я обновился до 0.8.0 и внес изменения, чтобы добавить FOREACH перед ним, и он отлично работает. Спасибо. - person Jason Webber; 21.03.2011