単語を数える代わりに、文字を数える必要があります。しかし、Apache Pig バージョン 0.8.1-cdh3u1 を使用してこれを実装する際に問題があります。
次の入力があるとします。
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 はダンプできますが、「ダンプ D」は「エラー 2997: バックアップされたエラーから例外を再作成できません: java.lang.ClassCastException: java.lang.Integer を org.apache.pig.data にキャストできません」という結果になります。 .タプル"
dump C が表示されます (3 番目の値が奇妙なタプルであるにもかかわらず):
(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 も含まれていますが、後で構文的に整理できます... UDF を書くのは避けたいですそれ以外の場合は、Java API を直接使用するだけです。
しかし、キャストエラーは本当にわかりません。誰か説明してくれませんか。