我需要数字母,而不是数单词。但是我在使用 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 显示(尽管第三个值是一个奇怪的元组):
(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。
但我并没有真正得到演员错误。有人可以解释一下吗。