2013-06-19 15 views
6

で、私は次の形式でのフィードを持っています。グループの複数のフィールドと出力タプル

Hour Key ID Value 
    1 K1 001  3 
    1 K1 002  2 
    2 K1 005  4 
    1 K2 002  1 
    2 K2 003  5 
    2 K2 004  6 

と私はValueを合計が、タプルとしてIDを保つ、その後(Hour, Key)によってグループにフィードをしたい:

({1, K1}, {001, 002}, 5) 
({2, K1}, {005}, 4) 
({1, K2}, {002}, 1) 
({2, K2}, {003, 004}, 11) 

私はValueの合計を生成するのにFLATTENを使用する方法を知っていますが、タプルとしてIDを出力する方法はわかりません。これはこれまで私が持っているものです:

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int); 
B = GROUP A BY (Hour, Key); 
C = FOREACH B GENERATE 
    FLATTEN(group) AS (Hour, Key), 
    SUM(A.Value) AS Value 
; 

あなたはこれを行う方法を説明しますか?感謝します!

+0

あなたが探している最終状態/出力を提供することができます - 私はあなたが「タプルとして出力ID」によって何を意味するか理解していない –

+0

@クリスを、最終状態は何とか私は上記の持っている作品のようになります: '(Hour、Key)'をキーとし、タプル( '{001,002}'など)のようなすべての関連する 'ID(s) 'に' Value'の合計を加えたものです。意味があるかどうか教えてください。ありがとう! – Rock

答えて

7

バッグ投影演算子.を使用するだけで済みます。これにより、タプルに指定した要素だけがある新しいバッグが作成されます。あなたの場合、A.IDを使用してください。実際には、すでにこの演算子を使用してSUMに入力を提供しています。つまり、sumへの入力は単一要素のタプルの袋で、Valueフィールドを投影して作成します。

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int); 
B = GROUP A BY (Hour, Key); 
C = FOREACH B GENERATE 
    FLATTEN(group) AS (Hour, Key), 
    A.ID, 
    SUM(A.Value) AS Value 
; 
+0

ありがとう、ウィニー。これは素晴らしい。私はまだ豚の中でどのように袋が動作するかをよりよく把握する必要があると思います。ありがとう! – Rock

関連する問題