我對豬很新,對日誌解析有問題。我目前通過regex_extract在我的url字符串中解析出重要的標籤,但我想我應該將整個字符串轉換爲地圖。我正在使用0.10製作一組樣本數據,但我開始變得非常迷茫。實際上,我的url字符串有重複的標籤。所以我的地圖實際上應該是一個以袋子爲價值的地圖。然後,我可以使用拼合來編寫任何後續作業..阿帕奇豬 - url解析成地圖
這裏是我的測試數據。最後一項顯示我的問題與重複標籤。
`pig -x local`
grunt> cat test.log
test1 user=3553&friend=2042&system=262
test2 user=12523&friend=26546&browser=firfox
test2 user=205&friend=3525&friend=353
我正在使用標記大小來生成內袋。
grunt> A = load 'test.log' as (f:chararray, url:chararray);
grunt> B = foreach A generate f, TOKENIZE(url,'&') as attr;
grunt> describe B;
B: {f: chararray,attr: {tuple_of_tokens: (token: chararray)}}
grunt> dump B;
(test1,{(user=3553),(friend=2042),(system=262)})
(test2,{(user=12523),(friend=26546),(browser=firfox)})
(test2,{(user=205),(friend=3525),(friend=353)})
在這些關係中使用嵌套的foreach,但我認爲他們有一定的侷限性,我不知道..
grunt> C = foreach B {
>> D = foreach attr generate STRSPLIT($0,'=');
>> generate f, D as taglist;
>> }
grunt> dump C;
(test1,{((user,3553)),((friend,2042)),((system,262))})
(test2,{((user,12523)),((friend,26546)),((browser,firfox))})
(test2,{((user,205)),((friend,3525)),((friend,353))})
grunt> G = foreach C {
>> H = foreach taglist generate TOMAP($0.$0, $0.$1) as tagmap;
>> generate f, H as alltags;
>> }
grunt> describe G;
G: {f: chararray,alltags: {tuple_of_tokens: (tagmap: map[])}}
grunt> dump G;
(test1,{([user#3553]),([friend#2042]),([system#262])})
(test2,{([user#12523]),([friend#26546]),([browser#firfox])})
(test2,{([user#205]),([friend#3525]),([friend#353])})
grunt> MAPTEST = foreach G generate f, flatten(alltags.tagmap);
grunt> describe MAPTEST;
MAPTEST: {f: chararray,null::tagmap: map[]}
grunt> res = foreach MAPTEST generate $1#'user';
grunt> dump res;
(3553)
()
()
(12523)
()
()
(205)
()
()
grunt> res = foreach MAPTEST generate $1#'friend';
grunt> dump res;
()
(2042)
()
()
(26546)
()
()
(3525)
(353)
所以,這並不可怕。我認爲它很接近,但並不完美。我最大的擔憂是我需要將標籤分組,至少在我將其添加到地圖之前,最後一行有2個「friend」標籤。
grunt> dump C;
(test1,{((user,3553)),((friend,2042)),((system,262))})
(test2,{((user,12523)),((friend,26546)),((browser,firfox))})
(test2,{((user,205)),((friend,3525)),((friend,353))})
我嘗試嵌套的foreach與一組,但多數民衆贊成在導致錯誤。
grunt> G = foreach C {
>> H = foreach taglist generate *;
>> I = group H by $1;
>> generate I;
>> }
2013-01-18 14:56:31,434 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 34, column 10> Syntax error, unexpected symbol at or near 'H'
任何人有任何想法如何更接近生成這個URL字符串到地圖袋?想象會有一個豬宏或什麼的,因爲這似乎是一個常見的用例。任何想法都非常感謝。
+1:解釋問題的出色工作,展示您嘗試過的內容,並提供可簡明地展示問題的示例輸入。 –