将数据列侧分组为pig中的单个数据集

时间:2016-02-11 10:26:02

标签: group-by apache-pig union

我有像

这样的数据
(1,a,null)
(4,b,null)
(7,c,null)
(1,a,3)
(4,b,6)
(7,c,9)

我希望每个列都有不同的值及其计数,例如

(1,2)
(4,2)
(7,2)
(a,2)
(b,2)
(c,2)
(null,3)
(3,1)
(6,1)
(9,1)

如果前3个记录是不同的值并且它的计数在第一个,则接下来的3个记录是不同的值,它在第二个记录中的计数和最后4个记录是不同的值,它在最后一列中计数。

为此,我尝试按列分组值,如

x = load 'path/to/file' using PigStorage(',') AS (col1:int,col2:chararray,col3:chararray);
B1 = GROUP x by col1;
B2 = GROUP x by col2;
B3 = GROUP x by col3;

C1 = FOREACH B1 GENERATE $0 as col1:chararray,COUNT(x);
C2 = FOREACH B2 GENERATE $0 as col2:chararray,COUNT(x);
C3 = FOREACH B3 GENERATE $0 as col3:chararray,COUNT(x);

这是分开的数据:
C1结果是:

(1,{(1,a,null),(1,a,null)})
(4,{(4,b,null),(4,b,6)})
(7,{(7,c,null),(7,c,9)})

C2结果是:

(a,{(1,a,null),(1,a,3)})
(b,{(4,b,null),(4,b,6)})
(c,{(7,c,null),(7,c,9)})

C3结果是:

(null,{(1,a,null),(4,b,null),(7,c,null)})
(3,{(1,a,3)})
(6,{(4,b,6)})
(7,{(7,c,9)})

但我希望将所有数据集数据放在单个数据集中,如下所示,而不使用uninon关键字

(1,{(1,a,null),(1,a,null)})
(4,{(4,b,null),(4,b,6)})
(7,{(7,c,null),(7,c,9)})
(a,{(1,a,null),(1,a,3)})
(b,{(4,b,null),(4,b,6)})
(c,{(7,c,null),(7,c,9)})
(null,{(1,a,null),(4,b,null),(7,c,null)})
(3,{(1,a,3)})
(6,{(4,b,6)})
(7,{(7,c,9)})

提前致谢

1 个答案:

答案 0 :(得分:0)

将数据作为行读取并进行字数统计。

<强>脚本

raw_data= LOAD 'test3.txt' AS (line:chararray);
words = FOREACH raw_data GENERATE FLATTEN(TOKENIZE(line)) as word;
grouped = GROUP words BY word;
wordcount = FOREACH grouped GENERATE group, COUNT(words);
DUMP wordcount;

<强>输出

enter image description here