10. AVEC UN SEUL OBJECT
DatumWriter<Trade> writer = new SpecificDatumWriter<Trade>();
encoder = EncoderFactory.get().binaryEncoder(outputStream, null);
writer.write(trade, encoder);
11. PUIS POUR LIRE
DatumReader<Trade> reader = new SpecificDatumReader<Trade>();
decoder = DecoderFactory.get().binaryDecoder(inputStream, null);
trade = reader.read(null, decoder);
12. SANS GÉNÉRATION
GenericRecord record = new GenericData.Record(SCHEMA);
record.put("ProductId", 123);
record.put("Nominal", 42000);
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(SCHEMA
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(SCHEMA
14. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
15. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();
16. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();
DataFileWriter<GenericRecord> dataFileWriter
= new DataFileWriter<>(datumWriter);
17. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();
DataFileWriter<GenericRecord> dataFileWriter
= new DataFileWriter<>(datumWriter);
dataFileWriter.setCodec(CodecFactory.snappyCodec());
18. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();
DataFileWriter<GenericRecord> dataFileWriter
= new DataFileWriter<>(datumWriter);
dataFileWriter.setCodec(CodecFactory.snappyCodec());
dataFileWriter.create(TRADE_SCHEMA, avroDataFile);
19. ECRIRE EN MASSE
File avroDataFile; // on peut aussi utiliser un OutputStream
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>();
DataFileWriter<GenericRecord> dataFileWriter
= new DataFileWriter<>(datumWriter);
dataFileWriter.setCodec(CodecFactory.snappyCodec());
dataFileWriter.create(TRADE_SCHEMA, avroDataFile);
for (GenericRecord record : records) {
dataFileWriter.append(record);
}
21. ET POUR LIRE ?
File avroDataFile; // on peut aussi utiliser un InputStream
22. ET POUR LIRE ?
File avroDataFile; // on peut aussi utiliser un InputStream
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
23. ET POUR LIRE ?
File avroDataFile; // on peut aussi utiliser un InputStream
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
DataFileReader<GenericRecord> dataFileReader
= new DataFileReader(avroDataFile, datumReader);
24. ET POUR LIRE ?
File avroDataFile; // on peut aussi utiliser un InputStream
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
DataFileReader<GenericRecord> dataFileReader
= new DataFileReader(avroDataFile, datumReader);
for (GenericRecord record : dataFileReader) {
// traitement sur chaque record
}
27. LA KILLER FEATURE
// la résolution de schema
new GenericDatumReader(writerSchema, readerSchema)
Writer Schema
Le schéma qui a été utilisé pour sérialiser
28. LA KILLER FEATURE
// la résolution de schema
new GenericDatumReader(writerSchema, readerSchema)
Reader Schema
Les données dont vous avez besoin
29. ENTRE 2 SCHEMAS, ON PEUT
- ajouter un champ
- supprimer un champ
- renommer un champ (avec un alias)
On ne peut pas changer le type d'un champ
38. RESSOURCES
Ces slides :
Une variante "alt.net" de cette prez :
La spec avro :
Le tuto MS :
Le SDK MS Hadoop :
https://github.com/alexvictoor/AvroDevoxxFr
https://github.com/alexvictoor/AvroAltNet
http://avro.apache.org/docs/1.7.7/spec.html
http://bit.ly/1uYRX3I
http://hadoopsdk.codeplex.com/SourceControl/latest