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"));
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);
}
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.
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()