2012-07-18 11 views
9

私はいくつかのレコードをフィルタリングするためにPigLatinを使用しています。PigLatinを使用して複製を削除する

User1 8 NYC 
User1 9 NYC 
User1 7 LA 
User2 4 NYC 
User2 3 DC 

スクリプトは、ユーザーの複製を削除し、これらのレコードの1つを保持する必要があります。 linuxのユニークなコマンドのようなもの。

出力は次のようになります。

User1 8 NYC 
User2 4 NYC 

任意の提案ですか?

答えて

20

明確なあなたの出力は、入力列($0, $1, $2)のすべてが含まれているとして、あなただけの列($0, $2)または($0)を持っており、$1を失う投影上の異なる行うことができますうまく動作しません。

ユーザーごとに1レコード(任意のレコード)を選択するには、GROUP BYFOREACHLIMITのネストを使用できます。例:

inpt = load '......' ......; 
user_grp = GROUP inpt BY $0; 
filtered = FOREACH user_grp { 
     top_rec = LIMIT inpt 1; 
     GENERATE FLATTEN(top_rec); 
}; 

このアプローチでは、フィールドのサブセット上で一意のレコードを取得し、また、あなたがコントロールすることができ、各ユーザーごとの出力レコードの数を制限するのに役立ちます。

+0

ありがとう、それはまさに私が探していたものです。 – aalsum

0

Pigは、一意のデータを選択するDISTINCTコマンドを提供します。フィールドでdistinctを使用する場合は、foreachネストされたブロックでDistinctを使用します。あなたの特定の例

+0

Distinctを使用している間は注意してください。DISTINCTキーワードの欠点は次のとおりです。最初のレコードのみが削除されることは確かではありません。 –

関連する問題