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

scala hadoop hdfs apache-spark sequencefile

8586 просмотра

2 ответа

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

Автор: samthebest Источник Размещён: 12.09.2019 02:37

Ответы (2)


11 плюса

Решение

Распространенные проблемы, кажется, становятся странными и не могут привести исключение из 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())
Автор: samthebest Размещён: 06.06.2014 01:42

0 плюса

Вот фрагмент со всеми необходимыми импортами, которые вы можете запустить из spark-shell, в соответствии с запросом @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)
Автор: Chris Bedford Размещён: 27.07.2019 10:17
Вопросы из категории :
32x32