2012-03-15 30 views
5

Nói rằng tôi có giá trị ghi lại ngày tháng cho người dùng cụ thể trong tập tin văn bản, nhưLàm thế nào để phân tích CustomWritable từ văn bản trong Hadoop

#userid; unix-timestamp; value 
1; 2010-01-01 00:00:00; 10 
2; 2010-01-01 00:00:00; 20 
1; 2010-01-01 01:00:00; 11 
2; 2010-01-01 01:00:00, 21 
1; 2010-01-02 00:00:00; 12 
2; 2010-01-02 00:00:00; 22 

Tôi có một lớp tùy chỉnh "SessionSummary" thực hiện readFieldsghi của WritableComparable. Mục đích là tổng hợp tất cả các giá trị cho mỗi người dùng cho mỗi ngày theo lịch.

Vì vậy, các mapper bản đồ các dòng cho mỗi người dùng, là sản phẩm giảm tóm tắt tất cả các giá trị mỗi ngày mỗi người dùng và kết quả đầu ra một SessionSummary như TextOutputFormat (sử dụng toString của SessionSummary, như chuỗi UTF-8 tách biệt bởi tab):

1; 2010-01-01; 21 
2; 2010-01-01; 41 
1; 2010-01-02; 12 
2; 2010-01-02; 22 

Nếu tôi cần sử dụng các mục nhập tóm tắt này cho giai đoạn Map/Reduce thứ hai, tôi nên phân tích dữ liệu tóm tắt này như thế nào để điền các thành viên? Tôi có thể sử dụng lại readFields và phương thức ghi hiện tại (của triển khai thực hiện giao diện WritableComparable) bằng cách sử dụng chuỗi văn bản là DataInput bằng cách nào đó không? Này (rõ ràng) không làm việc:

public void map(...) { 
    SessionSummary ssw = new SessionSummary(); 
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8")))); 
} 

Nói chung: Có một thực hành tốt nhất để thực hiện các phím tùy chỉnh và các giá trị trong Hadoop và làm cho họ dễ dàng tái sử dụng qua nhiều giai đoạn M/R, khi vẫn giữ văn bản con người có thể đọc được đầu ra ở mọi giai đoạn?

(Hadoop phiên bản 0.20.2/CDH3u3)

Trả lời

8

Các định dạng đầu ra cho công việc MR đầu tiên của bạn nên được SequenceFileOutputFormat - điều này sẽ lưu trữ các Khóa/giá trị sản lượng từ giảm tốc trong một định dạng nhị phân, mà sau đó có thể được đọc lại trong công việc MR thứ hai của bạn bằng cách sử dụng SequenceFileInputFormat. Ngoài ra, hãy đảm bảo bạn đặt outputKeyClassoutputValueClass trên Job tương ứng.

Người lập bản đồ trong công việc thứ hai sau đó có SessionSummary (và bất cứ kiểu giá trị là)

Nếu bạn cần phải nhìn thấy đầu ra văn bản từ công việc MR đầu tiên, bạn có thể chạy sau đây trên các tập tin đầu ra trong HDFS :

hadoop fs -libjars my-lib.jar -text output-dir/part-r-* 

này sẽ đọc trong file chuỗi Key/Value pairs và gọi toString() trên cả hai đối tượng, tab tách chúng khi xuất ra để stdout. Các -libjars chỉ định nơi hadoop có thể tìm thấy khóa tùy chỉnh/giá trị của bạn

+1

Cảm ơn Chris! Vì vậy, đối với công việc MR thứ hai, tôi đặt conf.setInputFormat (SequenceFileInputFormat.class), và các khóa Mapper và các lớp giá trị giống như trong đầu ra của Reducer đầu tiên, đúng không? – thomers

+0

Đúng vậy. –

+0

Làm cách nào để đặt rõ ràng khóa và giá trị Mapper cho công việc MR thứ hai? Tôi đang thử nghiệm với IdentityMapper, và nó dự kiến ​​văn bản là chìa khóa. – thomers

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