2014-06-06 18 views

Trả lời

10

Các sự cố thường gặp có vẻ lạ lùng không thể truyền ngoại lệ từ BytesWritable sang NullWritable. Vấn đề phổ biến khác là BytesWritable getBytes là một đống vô nghĩa vô nghĩa mà không nhận được byte chút nào. Những gì getBytes không nhận được byte của bạn hơn là thêm một tấn số không vào cuối! Bạn phải sử dụng copyBytes

val rdd: RDD[Array[Byte]] = ??? 

// To write 
rdd.map(bytesArray => (NullWritable.get(), new BytesWritable(bytesArray))) 
    .saveAsSequenceFile("/output/path", codecOpt) 

// To read 
val rdd: RDD[Array[Byte]] = sc.sequenceFile[NullWritable, BytesWritable]("/input/path") 
    .map(_._2.copyBytes()) 
+0

Bài đăng này tương đối cũ nên chỉ muốn biết câu trả lời vẫn được cập nhật? Vẫn còn cần thiết để sử dụng copyBytes trước khi đọc? –

+0

@SamStoelinga Có, tôi nghĩ vậy, đó là API Hadoop không có khả năng thay đổi. – samthebest

+0

Một giải pháp thay thế hiệu quả hơn là sử dụng ' .getBytes()' và chỉ xử lý tối đa ' .getLength()' bytes. Tất nhiên, nếu bạn thực sự cần một 'RDD [Array [Byte]]', cách tiếp cận này sẽ không hoạt động, nhưng bạn có thể xem xét một 'RDD [(Array [Byte], Int)]'. – user1609012

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