web-dev-qa-db-fra.com

Comment extraire le schéma d'un fichier AVRO en Java

Comment extrayez-vous d'abord le schéma, puis les données d'un fichier avro en java? Identique à this question sauf en Java. 

J'ai vu des exemples sur la façon d'obtenir le schéma à partir d'un fichier avsc mais pas d'un fichier avro. Toute direction très appréciée.

Schema schema = new Schema.Parser().parse(new File("/home/Hadoop/Avro/schema/emp.avsc"));
16
mba12

Si vous souhaitez connaître le schéma d'un fichier Avro sans avoir à générer les classes correspondantes ni à définir la classe à laquelle appartient le fichier, vous pouvez utiliser la variable GenericDatumReader:

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(new File("file.avro"), datumReader);
Schema schema = dataFileReader.getSchema();
System.out.println(schema);

Et ensuite, vous pouvez lire les données à l'intérieur du fichier:

GenericRecord record = null;
while (dataFileReader.hasNext()) {
    record = dataFileReader.next(record);
    System.out.println(record);
}
21
Helder Pereira

Utilisez GenericDatumReader.getSchema() pour obtenir le schéma, puis Schema.toString(true) pour obtenir une "jolie" chaîne (en retrait).

En utilisant le même exemple que leur "Getting Started" doc :

DatumReader<User> userDatumReader = new SpecificDatumReader<>(User.class);
DataFileReader<User> dataFileReader = new DataFileReader<>(new File("users.avro"), userDatumReader);
// First, extract schema
Schema schema = dataFileReader.getSchema();    // <- get schema here
System.out.println(schema.toString(true));     // <- pretty-print here
// Then (if needed) read data
User user = null;
while (dataFileReader.hasNext()) {
    // Reuse user object by passing it to next(). This saves us from allocating
    // and garbage collecting many objects for files with many items.
    user = dataFileReader.next(user);
    System.out.println(user);
}

Résultat:

{
  "type" : "record",
  "name" : "User",
  "namespace" : "example.avro",
  "fields" : [ {
    "name" : "name",
    "type" : "string"
  }, {
    "name" : "favorite_number",
    "type" : [ "int", "null" ]
  }, {
    "name" : "favorite_color",
    "type" : [ "string", "null" ]
  } ]
}
... followed with data.
2
Hugues M.

Vous pouvez utiliser la bibliothèque de briques de données comme indiqué ici https://github.com/databricks/spark-avro qui chargera le fichier avro dans une Dataframe (Dataset<Row>)

Une fois que vous avez un Dataset<Row>, vous pouvez obtenir directement le schéma en utilisant df.schema()

1
Carlos Bribiescas