2016-06-20 7 views
0

私の入力データは以下の形式になります。Pigはキー変更列を生成します - 前のレコードと現在のレコードが異なる列を比較します

col1 col2 col3  effective date expiry date 
1 Q1 A1 Value1  01/01   01/02 
2 Q1 A1 Value1  01/02   01/03 
3 Q1 A1 Value1  01/03   01/05 
4 Q1 A1 Value2  01/05   01/06 
5 Q1 A1 Value2  01/06   01/07 
6 Q1 A1 Value2  01/07   01/08 
7 Q1 A1 Value1  01/08   01/11 
8 Q1 A1 Value1  01/11   12/31 

私はCOL1、COL2、COL3ではなく、すべての重複の値に基づいて重複を削除する必要があります。 col3の値が異なる値に変わるまで、レコード は重複しているとみなされます。たとえば。上記のデータでは、値1は4番目のレコードで値2に変わります。そのため、レコード1,2と3のうち最初のレコードのみを保持する必要があります。 そして、レコード4,5,6のうち、4番目のものだけが保持されるべきです。レコード7と8の間には7つしか保持されません。最後の2列は、実際には日付列(有効な と有効期限)です。 1,2,3のような複製は、1,2,3,4,5が同じ値を持つことができるなど、何度も出現する可能性があります。重複がない場合もあります。

私は2つのアプローチを念頭に置いていましたが、それらのコードをどのようにコードするかはわかりませんでした。

  1. だから、全てdupes 1から0までの値を変更し、キー(COL1の組み合わせ、COL2、COL3) 変更てkeyChangeカラム(1または0)を生成することを考えましたこのkeychangeカラムの値は1に設定する必要があります。次に、このカラムをフィルタリングできます。 しかし、udfに渡すときに入力をソート順にする必要があるので、UDFを書く必要があります(似たような機能を持つUDFはありますか?)。 udfにソートされたデータを渡すことは可能ですか?もしそうなら、どうですか?これはどんな種類のUDFですか? でもmapreduceコードを書いても、マッパーでレコードを出力して、すべてのソートを で行い、減速機で列を生成すると、どうすればいいですか?あなたの意見を教えてください。(地図作成プログラミングには新しいので、あなたのアイデアは学習に多くの助けになります。ありがとう!)

  2. "over"関数のドキュメントを調べると、以前のレコードと現在のレコードの同じ列だけが比較されます。もし何か私がのcol5(有効期限) col4(有効日)を昇順にソートした後、Col1、col2、Col3 でグループを作成し、有効日が以前のレコードの有効期限と同じであったレコードを削除することができます。しかし、オーバーファンクションを使用して2つの異なる列を比較する方法がわかりません。 私もこの1つについてあなたの考えを知らせてください。

これを解決する別の方法があるかどうか教えてください。あなたの時間をありがとう!

+0

できることは、col1、col2、col3を使用して行をグループ化し、グループの各行をudfに渡すことです。 udfでは、日付が連続しているかどうかをチェックしてから決定します。 –

+0

こんにちはVikas、入力いただきありがとうございます。私も同じアプローチを考えていました。私は今、そのUDFを書いています。私は1つの質問がある。出力袋に複数のタプルを書く必要があります。 C1、Q1、およびValue1の場合は1と7です。出力スキーマの記述方法についてはわかりません。 現在、私は を使用しています。スキーマbagSchema =新しいスキーマ(新しいSchema.FieldSchema( "filtered"、intuple、DataType.TUPLE)); – Aandal

+0

しかし、私はどのように複数のタプルを追加するか分からない。あなたはお勧めできますか?私は下のリンクを参照しています。 [link] http://www.spryinc。com/blog/guide-user-defined-functions-apache-pig [link]また、これらの2行が何であるか教えてください。 スキーマbagSchema =新しいスキーマ(新しいSchema.FieldSchema( "pair"、tupleSchema、DataType.TUPLE)); bagSchema.setTwoLevelAccessRequired(true); Schema.FieldSchema bagFs = new Schema.FieldSchema( "pairs"、bagSchema、DataType.BAG); なぜ最後の行に別のバッグを定義する必要がありますか? – Aandal

答えて

0

仮定 - 入力はCSVファイルです。

A = LOAD 'test.csv' using PigStorage(','); 
B = GROUP A BY $0,$1,$2; 
C = FOREACH B { 
D = LIMIT A 1; 
GENERATE D.$0,D.$1,D.$2,D.$3,D.$4; 
} 
DUMP C; 

希望します。

+0

これは、7番目と8番目のレコードの7番目のレコードを選択するための要件を満たしていないことに気付きました。 – Amit

関連する問題