2014-06-06 17 views

cevap

10

Sık karşılaşılan sorunlar, BytesWritable'dan NullWritable'a tuhaf bir istisna alamıyor gibi görünüyor. Diğer yaygın sorun ise BytesWritable getBytes, bayt almayan, anlamsız bir anlamsız saçmalık yığınıdır. getBytes'un ne yapması, byte'ları elde etmekten ziyade, sonuna kadar bir ton sıfır ekler! 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

Bu gönderi nispeten eskidir, bu nedenle cevabın hala güncel olup olmadığını öğrenmek istediniz mi? Okumadan önce copyBytes kullanmak hala gerekli mi? –

+0

@SamStoelinga Evet Sanırım, değişmesi mümkün olmayan Hadoop API'sı. – samthebest

+0

Daha verimli bir alternatif, .getBytes() 'işlevini kullanmak ve yalnızca .getLength()' baytlarını işlemektir. Tabii ki, kesinlikle bir RDD [Array [Byte]] 'na ihtiyacınız varsa, bu yaklaşım işe yaramaz, ancak bir RDD [(Array [Byte], Int)] 'yi düşünebilirsiniz. – user1609012