Apache pig 从bag中选择随机元组

Apache pig 从bag中选择随机元组,apache-pig,Apache Pig,有可能(有效地)从猪的袋子中选择一个随机元组吗? 我可以只取一个包的第一个结果(因为它是无序的),但在我的情况下,我需要一个适当的随机选择。 一种(非有效的)解决方案是计算包中的元组数,在该范围内取一个随机数,在包中循环,并在迭代次数与我的随机数匹配时停止。有人知道更快/更好的方法吗?您可以在嵌套的FOREACH语句中使用RANDOM()、ORDER和LIMIT来选择一个随机数最小的元素: inpt = load 'group.txt' as (id:int, c1:bytearray, c2:

有可能(有效地)从猪的袋子中选择一个随机元组吗? 我可以只取一个包的第一个结果(因为它是无序的),但在我的情况下,我需要一个适当的随机选择。 一种(非有效的)解决方案是计算包中的元组数,在该范围内取一个随机数,在包中循环,并在迭代次数与我的随机数匹配时停止。有人知道更快/更好的方法吗?

您可以在嵌套的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)})
输出:

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;”,每次运行都会得到不同的结果


编写自定义项可能会给您带来更好的性能,因为您不需要对包中的随机项进行二次排序。

我自己也需要这样做,并且惊奇地发现,一个非常简单的答案似乎是可行的,可以获得别名a的10%左右:


B=随机过滤A()<0.1

你将如何“在包中循环”?A=每个myBag{--do stuff};实际上,我还没有实现这种方法,所以我不确定这个解决方案是否也会起作用,因为它不会起作用;您无法跟踪迭代次数。这也可以通过sample函数获得:
B=sample A 0.1
作为旁注,我注意到在使用
RANDOM()
后跟
SPLIT
(或常规的
过滤器
)时出现了一些异常行为。在这种情况下,将数据集
A
(例如划分为
A1
A2
需要在应用
RANDOM()
函数后首先存储数据集。然后可以重新加载结果并使用
split
FILTER
对其进行分割,以获得“真实”分区。否则,您可能会得到两个集,使得
|A1 |+|A2 |<| A |