我有一个查询。我有一个格式为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)”
答案 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)