2012-09-14 22 views
10

Giả sử tôi có một tab tập tin phân chứa dữ liệu hoạt động người dùng được định dạng như thế này:Hadoop - composit chính

timestamp user_id page_id action_id 

Tôi muốn viết một công việc hadoop tính các hành động người dùng trên mỗi trang, vì vậy các tập tin đầu ra nên nhìn như thế này:

user_id page_id number_of_actions 

Tôi cần một cái gì đó giống như khóa tổng hợp ở đây - nó sẽ chứa user_id và page_id. Có cách nào chung để làm điều này với hadoop? Tôi không thể tìm thấy bất cứ điều gì hữu ích. Cho đến giờ tôi đang phát ra chìa khóa như thế này trong bản đồ:

context.write(new Text(user_id + "\t" + page_id), one); 

Nó hoạt động, nhưng tôi cảm thấy đó không phải là giải pháp tốt nhất.

Trả lời

13

Chỉ soạn riêng Writable của riêng bạn. Trong ví dụ của bạn một giải pháp có thể trông như thế này:

public class UserPageWritable implements WritableComparable<UserPageWritable> { 

    private String userId; 
    private String pageId; 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    userId = in.readUTF(); 
    pageId = in.readUTF(); 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    out.writeUTF(userId); 
    out.writeUTF(pageId); 
    } 

    @Override 
    public int compareTo(UserPageWritable o) { 
    return ComparisonChain.start().compare(userId, o.userId) 
     .compare(pageId, o.pageId).result(); 
    } 

} 

Mặc dù tôi nghĩ rằng ID của bạn có thể là một long, ở đây bạn có phiên bản String. Về cơ bản chỉ là serialization bình thường trên giao diện Writable, lưu ý rằng nó cần constructor mặc định, do đó bạn nên luôn luôn cung cấp một.

Logic compareTo cho biết rõ ràng cách sắp xếp tập dữ liệu và cũng cho bộ giảm tốc biết yếu tố nào bằng nhau để chúng có thể được nhóm lại.

ComparisionChain là một tiện ích đẹp của Guava.

Đừng quên ghi đè bằng bằng và mã băm! Trình phân vùng sẽ xác định trình giảm tốc bằng mã băm của khóa.

+0

ComparisionChain thực sự dễ dàng cho trường hợp sử dụng này. Cảm ơn –

1

Bạn có thể viết lớp của riêng bạn thực hiện Writable và WritableComparable có thể so sánh hai trường của bạn.

Pierre-Luc Bertrand