Записывать и читать необработанные байтовые массивы в 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)