做组BY后随机选择猪

时间:2014-06-12 09:35:36

标签: apache-pig

我有一个查询。我有一个格式为id:int,name:chararray

的数据
1, abc
1, def
2, ghi,
2, mno
2, pqr

之后我执行Group BY id并且我的数据变为

1, {(1,abc), (1,def)}
2, {(2,ghi), (2,mno), (2,pqr)}

现在我想从包中挑选一个随机值,我希望输出像

1, abc
2, mno

如果我们选择第一元组作为1或第二元组2或

知道如何做到这一点?

问题是我已将数据分组B;

DESCRIBE B
B: {group: int,A: {(id: int,min: chararray,fan: chararray,max: chararray)}}

C = FOREACH B GENERATE FLATTEN($1)
DESCRIBE C;
C: {A::id: int,A::min: chararray,A::fan: chararray,A::max: chararray}

rand =
    FOREACH B {
        shuf_ = FOREACH C GENERATE RANDOM() AS r, *;  line L
        shuf = ORDER shuf_ BY r;
        pick1 = LIMIT shuf 1;
    GENERATE
        group,
        FLATTEN(pick1);
    };

我在L行遇到错误此时出现错误“Pig脚本无法解析:表达式不是项目表达式:(名称:ScalarExpression)类型:null Uid:null)”

1 个答案:

答案 0 :(得分:1)

使用嵌套的foreach。为包中的每个项目分配一个随机值,按该值排序,然后选择要保留的第一个项目。你可以使它比这更紧凑,但这会向你展示每个想法。

脚本:

data = LOAD 'tmp/data.txt' AS (f1:int, f2:chararray);
grpd = GROUP data BY f1;
rand =
    FOREACH grpd {
        shuf_ = FOREACH data GENERATE f2, RANDOM() AS r;
        shuf = ORDER shuf_ BY r;
        pick1 = LIMIT shuf 1;
    GENERATE
        group,
        FLATTEN(pick1.f2);
    };
DUMP rand;

输出:

(1,abc)
(2,ghi)

再次运行:

(1,abc)
(2,pqr)

再次:

(1,def)
(2,pqr)

再一次!

(1,abc)
(2,ghi)

Whee!

(1,def)
(2,mno)