私は豚にかなり慣れていないので、ログの解析について質問があります。現在、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文字列をバッグのマップに生成する方法を知っている人はいますか?これは一般的なユースケースのように思われるので、豚のマクロか何かがあると考えました。どんなアイデアでも大歓迎です。