2013-01-13 38 views
5

Tôi đã tìm kiếm các ngày để tìm cách sử dụng dữ liệu bị giảm để lập bản đồ tiếp theo trong hadoop. Tôi đã có các đối tượng của lớp A làm dữ liệu đầu vào và các đối tượng của lớp B làm dữ liệu đầu ra. Vấn đề là, trong khi ánh xạ không chỉ B s được tạo ra nhưng mới A s là tốt.Chia dữ liệu bị cắt thành đầu ra và đầu vào mới trong Hadoop

Dưới đây là những gì tôi muốn đạt được:

1.1 input: a list of As 
1.2 map result: for each A a list of new As and a list of Bs is generated 
1.3 reduce: filtered Bs are saved as output, filtered As are added to the map jobs 

2.1 input: a list of As produced by the first map/reduce 
2.2 map result: for each A a list of new As and a list of Bs is generated 
2.3 ... 

3.1 ... 

Bạn sẽ nhận được ý tưởng cơ bản.

Tôi đã đọc rất nhiều về chuỗi nhưng tôi không chắc chắn cách kết hợp ChainReducer và ChainMapper hoặc thậm chí nếu đây là phương pháp phù hợp.

Vì vậy, đây là câu hỏi của tôi: Làm cách nào tôi có thể chia dữ liệu được ánh xạ trong khi giảm để lưu một phần làm đầu ra và phần khác làm dữ liệu đầu vào mới.

Trả lời

2

Thử sử dụng MultipleOutputs. Vì nó là Javadoc gợi ý:

Các MultipleOutputs lớp đơn giản hoá ghi dữ liệu đầu ra cho nhiều đầu ra

Trường hợp một: văn bản cho kết quả đầu ra nào khác ngoài việc mặc định đầu ra. Mỗi đầu ra bổ sung, hoặc đầu ra có tên, có thể được cấu hình với OutputFormat của riêng nó, với lớp khóa riêng của nó và với lớp giá trị riêng của nó.

Trường hợp hai: để ghi dữ liệu vào tập tin khác nhau được cung cấp bởi người dùng

mẫu Cách sử dụng trình công việc:

Job job = new Job(); 

FileInputFormat.setInputPath(job, inDir); 
FileOutputFormat.setOutputPath(job, outDir); 

job.setMapperClass(MOMap.class); 
job.setReducerClass(MOReduce.class); 
... 

// Defines additional single text based output 'text' for the job 
MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, 
LongWritable.class, Text.class); 

// Defines additional sequence-file based output 'sequence' for the job 
MultipleOutputs.addNamedOutput(job, "seq", 
    SequenceFileOutputFormat.class, 
    LongWritable.class, Text.class); 
... 

job.waitForCompletion(true); 
... 

Cách sử dụng trong Giảm:

String generateFileName(K k, V v) { 
    return k.toString() + "_" + v.toString(); 
} 

public class MOReduce extends 
    Reducer<WritableComparable, Writable,WritableComparable, Writable> { 
private MultipleOutputs mos; 
public void setup(Context context) { 
... 
mos = new MultipleOutputs(context); 
} 

public void reduce(WritableComparable key, Iterator<Writable> values, 
Context context) 
throws IOException { 
... 
mos.write("text", , key, new Text("Hello")); 
mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a"); 
mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b"); 
mos.write(key, new Text("value"), generateFileName(key, new Text("value"))); 
... 
} 

public void cleanup(Context) throws IOException { 
mos.close(); 
... 
} 

} 
+0

Hãy lưu ý rằng các ví dụ mã này dành cho Hadoop 0. * nhưng không phải 1.0 .4. Khi tôi làm việc với 1.0.4, các giao diện hơi thay đổi. Nhưng ý tưởng cơ bản là những gì tôi đang tìm kiếm. Cảm ơn bạn! – Mennny

+0

vâng, đó là sự thật. cái này là cho 0,20 – Amar

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