2013-06-19 30 views
6

Tôi có một thức ăn chăn nuôi theo định dạng sau:Nhóm của nhiều lĩnh vực và sản lượng tuple

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 

và tôi muốn vào nhóm thức ăn bởi (Hour, Key) sau đó tổng hợp các Value nhưng giữ ID như một tuple:

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

Tôi biết cách sử dụng FLATTEN để tạo tổng của Value nhưng không biết cách xuất ID làm bộ tuple. Đây là những gì tôi có cho đến thời điểm này:

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 
; 

Bạn có giải thích cách thực hiện việc này không? Cảm kích điều đó!

+0

bạn có thể cung cấp trạng thái cuối cùng/đầu ra bạn đang tìm kiếm - không chắc chắn tôi hiểu những gì bạn có ý nghĩa bởi "ID đầu ra như một tuple" –

+0

@ Chris, trạng thái cuối cùng sẽ là bằng cách nào đó giống như mảnh tôi đã ở trên : '(Giờ, Khóa)' làm khóa, tất cả các 'ID (s)' liên kết của nó giống như trong một bộ dữ liệu (như '{001, 002}', v.v.) cộng với tổng của 'Giá trị'. Xin vui lòng cho tôi biết nếu nó có ý nghĩa. Cảm ơn! – Rock

Trả lời

7

Bạn chỉ cần sử dụng toán tử chiếu túi, .. Điều này sẽ tạo ra một túi mới nơi các bộ dữ liệu chỉ có (các) phần tử bạn chỉ định. Trong trường hợp của bạn, hãy sử dụng A.ID. Thực tế, bạn đã sử dụng toán tử này để cung cấp đầu vào cho SUM - đầu vào cho tổng là một nhóm các phần tử đơn, mà bạn tạo bằng cách chiếu trường 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

Cảm ơn bạn rất nhiều, Winnie. Điều đó thật tuyệt. Đoán tôi vẫn cần nắm bắt tốt hơn cách thức hoạt động của túi trong Pig. Cảm ơn! – Rock