2012-02-04 9 views
4

私はしばらくの間この質問に固執してきました。私は次のようなデータファイルを持っています:豚の袋の値でグルーピング

2012/01/01  Name1  "Category1,Category2,Category3" 
2012/01/01  Name2  "Category2,Category3" 
2012/01/01  Name3  "Category1,Category5" 

各項目はカンマ区切りのカテゴリリストに関連付けられています。私はこのような出力を取得するには、カテゴリ名でグループにできるようにしたいと思います:

Category1 Name1, Name3 
Category2 Name1, Name2 
... 
Category5 Name3 

(さらに具体的には、私はアイテムの名前を必要としない - というの項目数だけカウントをカテゴリがするでしょう)

カンマで区切られたカテゴリフィールドを取得し、それをPigバッグに変換するためにUDFを作成しました。 - 実際には、ネストされた袋の値によってグループ分けを行って、私は次のステップに引っかかってい {date: chararray, name: chararray, categories: {t: (category:chararray)}}

:私のデータスキーマは今、このようなものです。私は幸運なしにFOREACHのネストされたステートメントのバリエーションを試しました。たとえば:

x = FOREACH myData 
{ 
categoryNames = FOREACH categories GENERATE category; 
GENERATE myData.Name, categoryNames; 
} 

私の考えでは、構文のこの種のは、私がオーバーGROUPを実行することができます(名前、カテゴリ)のタプルを生成するということでした。しかし、実際の出力はバッグ全体であり、私を平方1に戻しています。進歩する方法についてのアイデアはありません。ヘルプ/フィードバックが最も高く評価されます。ありがとう!

答えて

5

それぞれの名前がデータファイル内で一意であると仮定すると、FLATTENカテゴリのバッグ、GROUPカテゴリ、およびCOUNTカテゴリ別の名前の数を指定できます。

name_category = 
    FOREACH data 
    GENERATE 
     name, 
     FLATTEN(categories) AS category; 

category_group = 
    GROUP name_category 
    BY category; 

category_count = 
    FOREACH category_group 
    GENERATE 
     FLATTEN(group) AS category, 
     COUNT(name_category) AS count; 
+0

私が達成しようとしていたものと同じように、バッグ上のFLATTENの動作が複数のタプルの生成であることは考えられませんでした。ありがとう! – Inverseofverse