E/S Avro

Les transformations intégrées Read et Write conçues pour les fichiers Avro sont incluses dans AvroIO. Vous pouvez utiliser AvroIO pour lire/écrire des fichiers locaux (situés sur le système où votre programme Java est exécuté) aussi bien que des fichiers distants stockés dans Google Cloud Storage.

Java

Remarque : Si vous souhaitez que votre pipeline effectue des opérations en lecture ou en écriture dans des fichiers locaux, vous devez utiliser DirectPipelineRunner pour exécuter votre pipeline en local. En effet, les instances de Google Compute Engine auxquelles le service Dataflow fait appel pour exécuter ce pipeline ne pourront pas accéder en lecture ni en écriture aux fichiers situés sur votre ordinateur local.

Spécifier un schéma Avro

Pour utiliser une transformation AvroIO, vous devez spécifier un schéma Avro décrivant les enregistrements à lire ou à écrire. Avro s'appuie sur des schémas pour décrire la sérialisation des données. Pour savoir comment fonctionnent ces schémas, consultez la documentation Avro.

Vous avez la possibilité de lire des enregistrements Avro spécifiques en fournissant un type de classe généré par Avro. Vous pouvez aussi lire des enregistrements GenericRecords en fournissant un objet org.apache.avro.Schema. En règle générale, vous lisez l'objet Schema à partir d'un fichier de schéma (.avsc). Vous pouvez également spécifier un Schema sous forme de chaîne encodée JSON.

Pour fournir un schéma, il vous suffit d'utiliser la méthode .withSchema avec la transformation AvroIO. Vous devez appeler .withSchema chaque fois que vous utilisez AvroIO.Read ou AvroIO.Write.

Lire avec AvroIO

La transformation AvroIO.Read lit les enregistrements d'un ou plusieurs fichiers Avro, et crée une collection PCollection dont chaque élément représente un enregistrement. AvroIO.Read peut générer une collection PCollection contenant soit des objets d'une classe Avro générée automatiquement, soit des objets GenericRecord. Le type de la collection PCollection résultante dépend du type de schéma que vous choisissez.

L'utilisation d'une classe Avro générée automatiquement se traduira par une collection PCollection dont les éléments sont des objets relevant de ce même type de classe Avro, comme illustré ci-dessous :

Java

  PipelineOptions options = PipelineOptionsFactory.create();
  Pipeline p = Pipeline.create(options);

  PCollection<AvroAutoGenClass> records = p.apply(
    AvroIO.Read.named("ReadFromAvro")
          .from("gs://some/inputData.avro")
          .withSchema(AvroAutoGenClass.class));

Pour lire un ou plusieurs fichiers Avro de façon à produire une collection PCollection<GenericRecord>, vous pouvez transmettre un objet org.apache.avro.Schema ou un schéma écrit sous forme de chaîne encodée JSON. L'exemple de code suivant montre comment obtenir un objet org.apache.avro.Schema en analysant un fichier .avsc. L'objet Schema ainsi obtenu est utilisé pour lire les fichiers d'entrée Avro fragmentés à partir de Google Cloud Storage :

Java

  PipelineOptions options = PipelineOptionsFactory.create();
  Pipeline p = Pipeline.create(options);

  Schema schema = new Schema.Parser().parse(new File("schema.avsc"));

  PCollection<GenericRecord> records =
    p.apply(AvroIO.Read.named("ReadFromAvro")
                       .from("gs://my_bucket/path/records-*.avro")
                       .withSchema(schema));

De même que pour les autres sources basées sur les fichiers de Dataflow, la transformation AvroIO.Read peut lire plusieurs fichiers d'entrée. Consultez la section Lire des données d'entrée pour savoir comment gérer plusieurs fichiers lorsque vous effectuez des opérations de lecture à partir de sources basées sur des fichiers.

Écrire avec AvroIO

La transformation AvroIO.Write écrit une collection PCollection d'enregistrements Avro dans un ou plusieurs fichiers Avro. Pour utiliser AvroIO.Write, vous devez représenter vos données de sortie finales sous la forme d'une collection PCollection d'objets appartenant à une classe Avro générée automatiquement, ou sous la forme d'une collection PCollection de GenericRecords. Vous pouvez appliquer une transformation ParDo aux données pour leur donner la forme appropriée.

Pour écrire des enregistrements spécifiques, utilisez comme schéma Avro une classe Avro générée automatiquement :

Java

  PCollection<AvroAutoGenClass> filteredRecords = ...;
  filteredRecords.apply(AvroIO.Write.named("WriteToAvro")
                                    .to("gs://some/outputData.avro")
                                    .withSchema(AvroAutoGenClass.class)
                                    .withSuffix(".avro"));

Pour écrire des objets GenericRecord, vous pouvez transmettre un objet org.apache.avro.Schema (le plus souvent via l'analyse d'un fichier .avsc) ou un schéma écrit sous forme de chaîne encodée JSON. L'exemple de code suivant montre comment analyser un fichier .avsc pour obtenir un objet Schema, qui est ensuite utilisé pour écrire des fichiers de sortie Avro fragmentés dans Google Cloud Storage :

Java

  Schema schema = new Schema.Parser().parse(new File("schema.avsc"));

  PCollection<GenericRecord> records = ...;
  records.apply(AvroIO.Write.named("WriteToAvro")
                            .to("gs://my_bucket/path/numbers")
                            .withSchema(schema)
                            .withSuffix(".avro"));

Notez que la transformation AvroIO.Write écrit par défaut dans plusieurs fichiers de sortie. Pour plus d'informations, consultez la section Écrire des données de sortie.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.