Apache Spark kullanarak bir dosyaya nasıl RDD[Array[Byte]]
yazıyorsunuz ve tekrar okuyorsunuz?Kıvılcım dizisindeki ham bayt dizilerini yazıp oku - Sıralı Dosya Sırası Dizisini KullanarakDosya
7
A
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())
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? –
@SamStoelinga Evet Sanırım, değişmesi mümkün olmayan Hadoop API'sı. – samthebest
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