Записывать и читать необработанные байтовые массивы в Spark - используя файл последовательности Sequence File

Как ты пишешь RDD[Array[Byte]] в файл с помощью Apache Spark и снова прочитать его?

1 ответ

Решение

Распространенные проблемы, кажется, становятся странными и не могут привести исключение из BytesWritable к NullWritable. Другая распространенная проблема - BytesWritable getBytes это абсолютно бессмысленная куча чепухи, которая вообще не получает байтов. Какие getBytes это получить ваши байты, чем добавляет тонну нулей в конце! Вы должны использовать 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())

Вот фрагмент со всем необходимым импортом, который вы можете запустить из искровой оболочки по запросу @Choix

import org.apache.hadoop.io.BytesWritable
import org.apache.hadoop.io.NullWritable

val path = "/tmp/path"

val rdd = sc.parallelize(List("foo"))
val bytesRdd = rdd.map{str  =>  (NullWritable.get, new BytesWritable(str.getBytes) )  }
bytesRdd.saveAsSequenceFile(path)

val recovered = sc.sequenceFile[NullWritable, BytesWritable]("/tmp/path").map(_._2.copyBytes())
val recoveredAsString = recovered.map( new String(_) )
recoveredAsString.collect()
// result is:  Array[String] = Array(foo)
Другие вопросы по тегам