从包中选择随机元组

Posted

技术标签:

【中文标题】从包中选择随机元组【英文标题】:Selecting random tuple from bag 【发布时间】:2013-01-30 12:43:08 【问题描述】:

是否可以(有效地)从 pig 的包中选择一个随机元组? 我可以只取一个包的第一个结果(因为它是无序的),但就我而言,我需要一个适当的随机选择。 一个(不是有效的)解决方案是计算包中元组的数量,在该范围内取一个随机数,循环遍历包,并在迭代次数与我的随机数匹配时停止。有谁知道更快/更好的方法来做到这一点?

【问题讨论】:

你会如何“遍历包”? A = FOREACH myBag --do stuff ;实际上还没有实现这种方法,所以我不确定这个解决方案是否也能正常工作 那不行;您无法跟踪迭代次数。 【参考方案1】:

您可以在嵌套的 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 可能会给您带来更好的性能,因为您不需要在包内随机进行二次排序。

【讨论】:

【参考方案2】:

我需要自己做这件事,但令人惊讶的是,一个非常简单的答案似乎有效,可以得到大约 10% 的别名 A:

B = 按 RANDOM() 过滤 A

【讨论】:

这也可以通过示例函数获得:B = SAMPLE A 0.1 附带说明,我注意到在使用RANDOM() 后跟SPLIT(或常规FILTER)时出现一些异常行为。在这种情况下,将您的数据集A(例如,划分为A1A2)需要在应用RANDOM() 函数后首先存储您的数据集。然后可以重新加载结果并使用SPLITFILTER 对其进行拆分,以获得“真实”分区。否则,您可能会得到 2 套这样的 |A1| + |A2| < |A|

以上是关于从包中选择随机元组的主要内容,如果未能解决你的问题,请参考以下文章

将项目添加到 Django 中的元组元组后是不是可以重新启动服务器?

Python按整数递归排列并返回一组元组

Python数据类型 ——— 元组

元组的详细操作

python3元组

好好学python · 元组