1

id、val1、val2の形式のデータがあります

1,0.2,0.1
1,0.1,0.7
1,0.2,0.3
2,0.7,0.9
2,0.2,0.3
2,0.4,0.5

最初に、各 ID を val1 で降順に並べ替えたいと思います。

1,0.2,0.1
1,0.2,0.3
1,0.1,0.7
2,0.7,0.9
2,0.4,0.5
2,0.2,0.3

次に、各 ID に対して 2 番目の要素 id,val2 の組み合わせを選択します。たとえば、次のようになります。

  1,0.3
  2,0.5

どうすればこれにアプローチできますか?

ありがとう

4

2 に答える 2

5

Pig はスクリプト言語であり、SQL のようなリレーショナル言語ではありません。FOREACH 内にネストされた演算子を使用してグループを操作するのに適しています。解決策は次のとおりです。

A = LOAD 'input' USING PigStorage(',') AS (id:int, v1:float, v2:float);
B = GROUP A BY id; -- isolate all rows for the same id
C = FOREACH B { -- here comes the scripting bit
    elems = ORDER A BY v1 DESC; -- sort rows belonging to the id
    two = LIMIT elems 2; -- select top 2
    two_invers = ORDER two BY v1 ASC; -- sort in opposite order to bubble second value to the top
    second = LIMIT two_invers 1;
    GENERATE FLATTEN(group) as id, FLATTEN(second.v2);
};
DUMP C;

あなたの例では、id 1 には v1 == 0.2 で v2 が異なる 2 つの行があるため、id 1 の 2 番目の値は 0.1 または 0.3 になります。

于 2012-11-06T16:36:40.480 に答える
1
A = LOAD 'input' USING PigStorage(',') AS (id:int, v1:int, v2:int);
B = ORDER A BY id ASC, v1 DESC;
C = FOREACH B GENERATE id, v2;
DUMP C;
于 2012-11-06T15:22:22.600 に答える