Come si scrive RDD[Array[Byte]]
in un file utilizzando Apache Spark e lo si legge di nuovo?Scrittura e lettura di array di byte grezzi in Spark - utilizzando Sequence File SequenceFile
7
A
risposta
10
I problemi comuni sembrano essere uno strano non può generare eccezioni da BytesWritable a NullWritable. Altro problema comune è BytesWritable getBytes
è una pila di assurdità senza senso che non ottiene affatto byte. Quello che fa getBytes
è ottenere i byte che aggiunge una tonnellata di zeri alla fine! Devi usare 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())
Questo post è relativamente vecchio quindi volevo solo sapere se la risposta è ancora aggiornata? È ancora necessario usare copyBytes prima di leggere? –
@SamStoelinga Sì, penso di sì, è improbabile che l'API Hadoop cambi. – samthebest
Un'alternativa più efficiente è usare ' .getBytes()' e processare solo fino a 'BytesWritableInstance> .getLength()' byte. Naturalmente, se hai strettamente bisogno di un 'RDD [Array [Byte]]', questo approccio non funzionerà, ma potresti considerare un 'RDD [(Array [Byte], Int)]'. –
user1609012