是否可以(有效地)从猪的袋子中选择一个随机元组?我可以只取一个包的第一个结果(因为它是无序的),但就我而言,我需要一个适当的随机选择。一个(不是有效的)解决方案是计算包中元组的数量,在该范围内取一个随机数,循环遍历包,并在迭代次数与我的随机数匹配时停止。有谁知道更快/更好的方法来做到这一点?
问问题
3325 次
2 回答
2
您可以在嵌套的 FOREACH 语句中使用 RANDOM()、ORDER 和 LIMIT 来选择具有最小随机数的元素:
inpt = load 'group.txt' as (id:int, c1:bytearray, c2:bytearray);
groups = group inpt by id;
randoms = foreach groups {
rnds = foreach inpt generate *, RANDOM() as rnd; -- assign random number to each row in the bag
ordered_rnds = order rnds by rnd;
one_tuple = limit ordered_rnds 1; -- select tuple with the smallest random number
generate group as id, one_tuple;
};
转储随机数;
输入:
1 a r
1 a t
1 b r
1 b 4
1 e 4
1 h 4
1 k t
2 k k
2 j j
3 a r
3 e l
3 j l
4 a r
4 b t
4 b g
4 h b
4 j d
5 h k
输出:
(1,{(1,b,r,0.05172709255901231)})
(2,{(2,k,k,0.14351660053632986)})
(3,{(3,e,l,0.0854104195792681)})
(4,{(4,h,b,8.906013598960483E-4)})
(5,{(5,h,k,0.6219490873384448)})
如果你运行“dump randoms;” 多次,您应该为每次运行获得不同的结果。
编写 UDF 可能会给您带来更好的性能,因为您不需要在包中随机进行二次排序。
于 2013-01-31T15:01:08.640 回答
0
我需要自己做这个,并且令人惊讶地发现一个非常简单的答案似乎有效,可以获得大约 10% 的别名 A:
B = 通过 RANDOM() < 0.1 过滤 A
于 2015-08-14T04:53:21.097 回答