我对猪很陌生,并且对日志解析有疑问。我目前通过 regex_extract 解析出我的 url 字符串中的重要标签,但我认为我应该将整个字符串转换为地图。我正在使用 0.10 处理一组样本数据,但我开始迷路了。实际上,我的 url 字符串有重复的标签。所以我的地图实际上应该是一张以袋子为值的地图。然后我可以使用 flatten 编写任何后续工作。
这是我的测试数据。最后一个条目显示了我的重复标签问题。
`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 个“朋友”标签,至少在我将其添加到地图之前。
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 字符串生成到包地图中?认为会有一个猪宏或其他东西,因为这似乎是一个常见的用例。任何想法都非常感谢。