2012-08-08 13 views
14

La serializzazione di Avro è popolare con gli utenti di Hadoop, ma gli esempi sono così difficili da trovare.Utilizzo di apro avro reflect

Qualcuno può aiutarmi con questo codice di esempio? Sono principalmente interessato all'utilizzo dell'API di Reflect per leggere/scrivere in file e utilizzare le annotazioni Union e Null.

public class Reflect { 

    public class Packet { 
     int cost; 
     @Nullable TimeStamp stamp; 
     public Packet(int cost, TimeStamp stamp){ 
      this.cost = cost; 
      this.stamp = stamp; 
     } 
    } 

    public class TimeStamp { 
     int hour = 0; 
     int second = 0; 
     public TimeStamp(int hour, int second){ 
      this.hour = hour; 
      this.second = second; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     TimeStamp stamp; 
     Packet packet; 

     stamp = new TimeStamp(12, 34); 
     packet = new Packet(9, stamp); 
     write(file, packet); 

     packet = new Packet(8, null); 
     write(file, packet); 
     file.close(); 

     // open file to read. 
     packet = read(file); 
     packet = read(file); 
    } 
} 

risposta

27

Ecco una versione del programma di cui sopra che funziona.

Ciò utilizza anche la compressione del file.

import java.io.File; 
import org.apache.avro.Schema; 
import org.apache.avro.file.DataFileWriter; 
import org.apache.avro.file.DataFileReader; 
import org.apache.avro.file.CodecFactory; 
import org.apache.avro.io.DatumWriter; 
import org.apache.avro.io.DatumReader; 
import org.apache.avro.reflect.ReflectData; 
import org.apache.avro.reflect.ReflectDatumWriter; 
import org.apache.avro.reflect.ReflectDatumReader; 
import org.apache.avro.reflect.Nullable; 

public class Reflect { 

    public static class Packet { 
    int cost; 
    @Nullable TimeStamp stamp; 
    public Packet() {}      // required to read 
    public Packet(int cost, TimeStamp stamp){ 
     this.cost = cost; 
     this.stamp = stamp; 
    } 
    } 

    public static class TimeStamp { 
    int hour = 0; 
    int second = 0; 
    public TimeStamp() {}      // required to read 
    public TimeStamp(int hour, int second){ 
     this.hour = hour; 
     this.second = second; 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    // one argument: a file name 
    File file = new File(args[0]); 

    // get the reflected schema for packets 
    Schema schema = ReflectData.get().getSchema(Packet.class); 

    // create a file of packets 
    DatumWriter<Packet> writer = new ReflectDatumWriter<Packet>(Packet.class); 
    DataFileWriter<Packet> out = new DataFileWriter<Packet>(writer) 
     .setCodec(CodecFactory.deflateCodec(9)) 
     .create(schema, file); 

    // write 100 packets to the file, odds with null timestamp 
    for (int i = 0; i < 100; i++) { 
     out.append(new Packet(i, (i%2==0) ? new TimeStamp(12, i) : null)); 
    } 

    // close the output file 
    out.close(); 

    // open a file of packets 
    DatumReader<Packet> reader = new ReflectDatumReader<Packet>(Packet.class); 
    DataFileReader<Packet> in = new DataFileReader<Packet>(file, reader); 

    // read 100 packets from the file & print them as JSON 
    for (Packet packet : in) { 
     System.out.println(ReflectData.get().toString(packet)); 
    } 

    // close the input file 
    in.close(); 
    } 

} 
-1

vedere l'esempio 3 a https://sites.google.com/site/developertips/Home/java/apache-avro Essa mostra come è possibile utilizzare l'API di riflessione per scrivere e leggere classi Java.

+1

Visto quello. Questo è pensato per scrivere su un flusso. Quindi, se scritto su un file, sospetto che non contenga l'intestazione. Se è così, probabilmente non sarà possibile interpretarlo in un diverso lagnguage di programmazione. Inoltre, l'esempio non affronta l'uso di strutture dati più complesse con campi o unioni nullable. – fodon

+0

Sono d'accordo con @fodon. Mi piacerebbe essere in grado di vedere più esempi prolissi poiché credo che esistano alcuni bug che i test non stanno tenendo in considerazione. – Dan

+1

@LordAragon il collegamento non funziona più. Questo è un altro motivo per cui è buona norma condividere contenuti reali anche dal riferimento. – Sankalp

Problemi correlati