2013-05-08 17 views
11

Tôi muốn nhóm theo một trường nhất định và nhận đầu ra với các trường được nhóm. Dưới đây là một ví dụ về những gì tôi đang cố gắng để đạt được: -Làm thế nào để có được mảng/túi của các phần tử từ nhóm Hive bởi nhà điều hành?

Hãy tưởng tượng một bảng có tên là 'sample_table' với hai cột như sau: -

F1 F2 
001 111 
001 222 
001 123 
002 222 
002 333 
003 555 

Tôi muốn viết Hive Query mà sẽ cung cấp sản lượng dưới đây : -

001 [111, 222, 123] 
002 [222, 333] 
003 [555] 

Trong Pig, điều này có thể rất dễ dàng đạt được bằng một cái gì đó như thế này: -

grouped_relation = GROUP sample_table BY F1; 

Ai đó có thể đề nghị nếu có một cách đơn giản để làm như vậy trong Hive? Những gì tôi có thể nghĩ là viết một User Defined Function (UDF) cho điều này nhưng điều này có thể là một lựa chọn rất tốn thời gian.

Trả lời

20

Chức năng tổng hợp được tích hợp collect_set (doumented here) giúp bạn gần như những gì bạn muốn. Nó thực sự sẽ hoạt động trên ví dụ đầu vào của bạn:

SELECT F1, collect_set(F2) 
FROM sample_table 
GROUP BY F1 

Thật không may, nó cũng loại bỏ các yếu tố trùng lặp và tôi tưởng tượng đây không phải là hành vi mong muốn của bạn. Tôi thấy kỳ lạ là collect_set tồn tại, nhưng không có phiên bản nào để giữ bản sao. Someone else apparently thought the same thing. Có vẻ như câu trả lời hàng đầu và thứ hai sẽ cung cấp cho bạn UDAF mà bạn cần.

+9

Trong Hive 0,13 có chức năng 'collect_list' sẽ trả về bản sao. –

0

collect_set thực sự hoạt động như mong đợi vì một tập hợp theo định nghĩa là một tập hợp được xác định rõ và riêng biệt đối tượng tức là đối tượng xảy ra một lần hoặc không hoàn toàn trong một bộ.

Các vấn đề liên quan