1

ブタのバッグからランダムなタプルを(効率的に)選択することは可能ですか?バッグの最初の結果を取得することはできますが(順序付けされていないため)、私の場合は適切なランダム選択が必要です。1つの(効率的ではない)解決策は、バッグ内のタプルの数を数え、その範囲内の乱数を取得し、バッグをループして、反復回数が私の乱数と一致するたびに停止することです。誰かがこれを行うためのより速い/より良い方法を知っていますか?

4

2 に答える 2

2

ネストされたFOREACHステートメントでRANDOM()、ORDER、およびLIMITを使用して、乱数が最小の1つの要素を選択できます。

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)})

「ランダムダンプ」を実行した場合。複数回、実行ごとに異なる結果が得られるはずです。

UDFを作成すると、バッグ内でランダムに2次ソートを実行する必要がないため、パフォーマンスが向上する可能性があります。

于 2013-01-31T15:01:08.640 に答える
0

私はこれを自分で行う必要がありましたが、驚くべきことに、エイリアスAの約10%を取得するには、非常に単純な答えが機能しているように見えることがわかりました。

B = RANDOM()<0.1でAをフィルター処理する

于 2015-08-14T04:53:21.097 に答える