而不是計算單詞,我需要計數字母。 但我有實現這個使用Apache豬版本0.8.1-cdh3u1Pig Mapreduce來計算連續的字母
考慮以下問題輸入:
989;850;abcccc
29;395;aabbcc
的輸出中應該是:
989;850;a;1
989;850;b;1
989;850;c;4
29;395;a;2
29;395;b;2
29;395;c;2
這裏是我的嘗試:
A = LOAD 'input' using PigStorage(';') as (x:int, y:int, content:chararray);
B = foreach A generate x, y, FLATTEN(STRSPLIT(content, '(?<=.)(?=.)', 6)) as letters;
C = foreach B generate x, y, FLATTEN(TOBAG(*)) as letters;
D = foreach C generate x, y, letters.letters as letter;
E = GROUP D BY (x,y,letter);
F = foreach E generate group.x as x, group.y as y, group.letter as letter, COUNT(D.letter) as count;
A,B和C可以傾倒,但是「dump D」導致「ER ROR 2997:無法從後備錯誤重新創建異常:java.lang.ClassCastException:java.lang.Integer無法轉換爲org.apache.pig.data.Tuple「
轉儲C顯示(儘管第三個值是怪異的元組):
(989,850,a)
(989,850,b)
(989,850,c)
(989,850,c)
(989,850,c)
(989,850,c)
(29,395,a)
(29,395,a)
(29,395,b)
(29,395,b)
(29,395,c)
(29,395,c)
下面是模式:
grunt> describe A; describe B; describe C; describe D; describe E; describe F;
A: {x: int,y: int,content: chararray}
B: {x: int,y: int,letters: bytearray}
C: {x: int,y: int,letters: (x: int,y: int,letters: bytearray)}
D: {x: int,y: int,letter: bytearray}
E: {group: (x: int,y: int,letter: bytearray),D: {x: int,y: int,letter: bytearray}}
F: {x: int,y: int,letter: bytearray,count: long}
這豬的版本似乎不支持TOBAG($ 2 .. $ 8),因此TOBAG(*),其中還包括X和y,但這可能是後來synactically排序... 我想避免寫一個UDF,否則我會直接使用Java API。
但我並沒有真正得到演員的錯誤。有人可以解釋一下嗎?
感謝示例代碼。那麼在「純」豬拉丁0.8中是不可能的? – rretzbach
我不認爲這是不可能的,但是爲了達到結果而使用大量的內置轉換來實現結果可能會更加昂貴(即:最終會有更多的MR作業)。例如:分組將始終強制縮減階段。 –