2014-06-06 10 views

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()) 
+0

Questo post è relativamente vecchio quindi volevo solo sapere se la risposta è ancora aggiornata? È ancora necessario usare copyBytes prima di leggere? –

+0

@SamStoelinga Sì, penso di sì, è improbabile che l'API Hadoop cambi. – samthebest

+0

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

Problemi correlati