8

ファイルからロードする一連のレコードがあり、最初に行う必要があるのは、列の最大値と最小値を取得することです。SQL では、次のようなサブクエリでこれを行います。

   select c.state, c.population, 
(select max(c.population) from state_info c) as max_pop, 
(select min(c.population) from state_info c) as min_pop
from state_info c

PIGでもこれを行う簡単な方法があるに違いないと思いますが、見つけるのに苦労しています。MAX と MIN の機能がありますが、次のことを試してみるとうまくいきませんでした:

records=LOAD '/Users/Winter/School/st_incm.txt'  AS (state:chararray, population:int);
with_max = FOREACH records GENERATE state, population, MAX(population);

これはうまくいきませんでした。各行に同じ値を持つ余分な列を追加してから、その列でそれらをグループ化したほうがうまくいきました。次に、その新しいグループの最大値を取得します。これは私が欲しいものを手に入れるための複雑な方法のように思えるので、誰かがもっと簡単な方法を知っているかどうか尋ねると思いました.

助けてくれてありがとう。

4

1 に答える 1

15

あなたが言ったように、すべてのデータをグループ化する必要がありますが、GROUP ALLを使用する場合、余分な列は必要ありません。

records = LOAD 'states.txt'  AS (state:chararray, population:int);
records_group = GROUP records ALL;
with_max = FOREACH records_group 
           GENERATE
               FLATTEN(records.(state, population)), MAX(records.population);

入力

CA  10
VA  5
WI  2

出力

(CA,10,10)
(VA,5,10)
(WI,2,10)
于 2011-03-08T19:44:39.883 に答える