2011-11-25 18 views
8

Tôi có một tệp tuần tự là đầu ra của công việc giảm bản đồ hadoop. Trong dữ liệu tệp này được viết bằng cặp giá trị khóa và bản thân giá trị là bản đồ. Tôi muốn đọc giá trị như một đối tượng MAP để tôi có thể xử lý thêm.Làm thế nào để đọc tập tin tuần tự hadoop?

Configuration config = new Configuration(); 
    Path path = new Path("D:\\OSP\\sample_data\\data\\part-00000"); 
    SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config); 
    WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance(); 
    Writable value = (Writable) reader.getValueClass().newInstance(); 
    long position = reader.getPosition(); 

    while(reader.next(key,value)) 
    { 
      System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
    } 

đầu ra của chương trình: Key: [này là chìa khóa] Giá trị là: {abc = 839.177, xyz = 548.498, lmn = 2, pqr = 1}

Ở đây tôi đang nhận được giá trị như chuỗi , nhưng tôi muốn nó như một đối tượng của bản đồ.

+0

Từ đâu đến 'val'? Và một Bản đồ không phải là "Có thể ghi", bạn đang sử dụng những gì cho các lớp trong công việc m/r của bạn? –

+0

Tôi chỉ có các tập tin tuần tự và không biết những gì họ đang làm trong bản đồ giảm job.And tôi được cung cấp với thông tin sau. "Mỗi tập tin như vậy cần phải được mở như một tập tin trình tự. Giải nén codec cần phải được sử dụng - lớp tệp trình tự dường như có thể cho bạn biết codec nén nào sẽ sử dụng và sau đó tôi nghĩ mỗi khóa và mỗi giá trị được mã hóa bằng TypedBytes. " – samarth

+0

Sau đó, bạn phải có được các lớp của khóa và giá trị, nếu không bạn sẽ không deserialize chúng đúng cách. –

Trả lời

6

Kiểm tra các tài liệu API cho SequenceFile#next(Writable, Writable)

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+textKey +" value is: "+val+"\n"); 
} 

nên được thay thế bằng

while(reader.next(key,value)) 
{ 
     System.out.println("Key is: "+key +" value is: "+value+"\n"); 
} 

Sử dụng SequenceFile.Reader#getValueClassName để có được những kiểu giá trị trong SequenceFile. SequenceFile có các loại khóa/giá trị trong tiêu đề tệp.

+0

Cảm ơn người đàn ông, lớp giá trị là "TypedBytesWritable" tôi có thể lấy đối tượng bản đồ từ lớp này không? – samarth

+1

[typedBytesWritable # getValue] (http://hadoop.apache.org/mapreduce/docs/current/api/org/apache/hadoop/typedbytes/TypedBytesWritable.html#getValue%28%29) sẽ nhận được đối tượng. –

+0

Hey nó làm việc cho tôi .. Cảm ơn bạn rất nhiều Praveen. – samarth